2010-12-10 22 views

Respuesta

19

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 al setlocale(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.

+0

1 - pero 'setlocale '! =' std :: locale' ... –

+0

@Billy: respuesta editada – icecrime

+1

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

9

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.

21

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

+0

+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. :( –

+2

@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

+0

Otorgando la recompensa a esta respuesta porque responde más directamente a la pregunta que originalmente hice. –

Cuestiones relacionadas