El estándar es bastante silencioso sobre lo que constituye un nombre de ubicación válido; solo el hecho de pasar un nombre de lugar no válido da como resultado std::runtime_error
. ¿Qué nombres de configuración regional se pueden usar en compiladores comunes de Windows como MSVC, MinGW e ICC?¿Qué nombres de configuración estándar están disponibles en los compiladores comunes de Windows?
Respuesta
Creo que la información que se necesita es here:
locale "lang[_country_region[.code_page]]"
| ".code_page"
| ""
| NULL
Esta página ofrece enlaces a:
Aunque mis respuestas cubre setlocale
en lugar de std::locale
, this MSDN page parece implicar que el formato es de hecho la misma:
Un objeto de la configuración regional de clase también almacena un nombre de localización como un objeto de la clase cuerdas . Utilizar un nombre de localidad no válido para construir una faceta de configuración regional o un objeto de configuración regional arroja un objeto de clase
runtime_error
. El nombre de la ubicación almacenada es "*" si el objeto de configuración regional no puede estar seguro de que una configuración regional de estilo C corresponde exactamente a que representa el objeto. De lo contrario, puede establecer una configuración regional coincidente dentro de la Biblioteca estándar C , para la ubicación loc de objeto, por llamando alsetlocale(LC_ALL, loc.name.c_str)
.
Véase también this page y this thread que tienden a demostrar que std::locale
utiliza internamente setlocale
.
Aquí hay un nombre de configuración regional que se puede usar prácticamente en cualquier lugar: ""
. Es decir, la cadena vacía. El está en contraste con la configuración regional "C"
que probablemente obtenga de manera predeterminada. La cadena vacía como argumento al std::setlocale()
significa algo así como "Usar la configuración regional preferida establecida por el usuario o el entorno". Si usa esto, la desventaja es que su programa no tendrá el mismo resultado en todas partes; Lo bueno es que sus usuarios pueden pensar que funciona de la manera que desean.
Ok, hay una diferencia entre las configuraciones regionales C y C++.
Vamos a empezar:
MSVC C++ std :: local y C setlocale
Acepta nombres específicos como "idioma [_Informe] [Página de código.]", Por ejemplo "English_United States.1251" De lo contrario arrojaría.Nota: código de página no puede ser 65001/UTF-8 y debe ser coherente con la norma ANSI página de códigos para este idioma (o simplemente se omite)
MSVC C++ std :: local y C setlocale en Vista y 7 locales deberían aceptar [Idioma] [- Script] [- País] como "en-US" usando códigos de idioma ISO-631 y regiones ISO 3166 y nombres de scripts.Lo probé con Visual Studio en Windows 7 - no funciona.
MinGW C++ std :: locale acepta "C" y "POSIX" no es compatible con otras configuraciones regionales, en realidad gcc admite configuraciones regionales solo a través de la biblioteca C de GNU, básicamente solo bajo Linux.
setlocale es una llamada API nativa de Windows, por lo que debe ser compatible con todo lo que mencioné anteriormente.
Puede admitir un rango más amplio de configuraciones regionales cuando se utiliza con bibliotecas alternativas de C++ como Apache stdcxx o STL Port.
ICC - No lo había probado pero depende de la biblioteca estándar de C++ que utiliza. Para el ejemplo en Linux, utilizó la libstdC++ de GCC, por lo que es compatible con todos los locales compatibles con gcc . No sé qué biblioteca estándar de C++ usa en Windows.
Si usted quiere tener "compilador y plataforma de" apoyo locales independientes (y de hecho soporte mucho mejor) echar un vistazo en Boost.Locale
Artyom
+1 e interesante: desafortunadamente, la biblioteca de la ICU (de la que depende la propuesta 'boost :: locale') es prohibitivamente costosa (en términos de tamaño binario) para la mayoría de las aplicaciones en las que trabajo. :( –
@Billy ONeal no tiene que usar ICU, Boost.Locale también proporciona biblioteca estándar y API basada en Win32 backends que le permiten utilizar la misma convención de nomenclatura con diferentes compiladores (es decir, en_US.UTF-8) como en sistemas Posix. – Artyom
Otorgando la recompensa a esta respuesta porque responde más directamente a la pregunta que originalmente hice. –
- 1. Windows Mobile - ¿Qué plataformas de scripting están disponibles?
- 2. ¿Qué rastreadores usb (software) están disponibles para Windows?
- 3. ¿Qué complementos de compilador scala están disponibles?
- 4. ¿Qué herramientas están disponibles para documentar los complementos de jQuery?
- 5. ¿Qué paquetes LaTeX están disponibles para los diagramas de circuitos?
- 6. ¿Los métodos incorporados de python están disponibles en un espacio de nombres alternativo en cualquier lugar?
- 7. ¿Qué fuentes están disponibles en Android?
- 8. ¿Qué informes están disponibles para svn?
- 9. ¿Qué registros de procesos distribuidos están disponibles para Erlang?
- 10. ¿Cuáles son los errores comunes de configuración de Magento?
- 11. ¿Por qué los nombres de funciones de biblioteca estándar son diferentes entre Windows y Linux?
- 12. ¿Qué controladores MySQL están disponibles para node.js?
- 13. Los comandos de .bashrc no están disponibles en Emacs
- 14. ¿Por qué algunas funciones en <cmath> no están en el espacio de nombres estándar?
- 15. ¿Qué tipos de bases de datos están disponibles en Android?
- 16. ¿Qué comandos de salida de consola están disponibles en Erlang?
- 17. ¿Qué propiedades están disponibles en Jenkins/Hudson para la configuración de compilación?
- 18. ¿Por qué los compiladores de C anteponen los guiones bajos a los nombres externos?
- 19. ¿Qué bibliotecas de voz están disponibles en Linux?
- 20. ¿Qué herramientas de registro de depuración están disponibles desde Javascript?
- 21. ¿Qué complementos/utilidades están disponibles para TFS?
- 22. ¿Qué diferentes algoritmos de clasificación están disponibles en Java 6?
- 23. ¿Qué IDEs están disponibles para R en Linux?
- 24. ¿Por qué los nombres de dominio están al revés?
- 25. ¿Qué fuentes de entropía están disponibles en heroku?
- 26. ¿Qué tipos de mensajes flash están disponibles en Rails?
- 27. ¿Dónde están todos los recursos estándar de íconos de Android?
- 28. ¿Cómo son los "nombres de interfaz" de Windows?
- 29. ¿Por qué los métodos de String.prototype están disponibles para los literales de cadena?
- 30. ¿Qué archivos COFF (archivos de objetos .obj de Windows) están disponibles?
1 - pero 'setlocale '! =' std :: locale' ... –
@Billy: respuesta editada – icecrime
gcc no es compatible con los nombres de configuración regional de "Estilo de Windows" en 'std :: locale', solo admite entornos locales POSIX y C. – Artyom