¿Qué nombres de configuración estándar están disponibles en los comstackdores comunes de Windows?

El estándar es bastante silencioso sobre lo que constituye un nombre de lugar válido; solo que pasar un nombre de lugar no válido da como resultado std::runtime_error . ¿Qué nombres de configuración regional se pueden usar en comstackdores comunes de Windows como MSVC, MinGW e ICC?

Creo que la información que necesita está aquí :

 locale "lang[_country_region[.code_page]]" | ".code_page" | "" | NULL 

Esta página proporciona enlaces a:

  • Cuerdas de idioma
  • Cadena de país / región
  • Páginas de códigos

Aunque mis respuestas cubren setlocale lugar de std::locale , esta página de MSDN parece implicar que el formato es el mismo:

Un objeto de configuración regional de clase también almacena un nombre de localidad como un objeto de cadena de clase. El uso de un nombre de localidad no válido para construir una faceta de localización o un objeto de localización arroja un objeto de clase runtime_error . El nombre de la configuración regional 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 la representada por el objeto. De lo contrario, puede establecer una configuración regional coincidente dentro de la biblioteca estándar C, para la ubicación loc del objeto, llamando a setlocale(LC_ALL, loc.name.c_str) .

También vea esta página y este hilo que tienden a mostrar que std::locale usa internamente setlocale .

Ok, hay una diferencia entre las configuraciones regionales C y C ++.

Empecemos:

  • MSVC C ++ std :: locale y C setlocale

    Acepta nombres de configuración regional como “Idioma [_País] [. Página de códigos]”, por ejemplo “English_United States.1251” De lo contrario, arrojaría. Nota: la página de códigos no puede ser 65001 / UTF-8 y debe ser coherente con la página de códigos ANSI para esta configuración regional (o simplemente omitida)

  • MSVC C ++ std :: locale y C setlocale en Vista y 7 deben aceptar configuraciones regionales [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 admite otras configuraciones regionales, en realidad gcc solo admite configuraciones regionales en la biblioteca C de GNU, básicamente solo en Linux.

    setlocale es una llamada API de Windows nativa, por lo que debería ser compatible con todo lo que mencioné anteriormente.

    Puede admitir un rango más amplio de configuraciones regionales cuando se usa 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. Por ejemplo, en Linux usaba libstdc ++ de GCC, por lo que es compatible con todas las configuraciones regionales que admite gcc. No sé qué biblioteca estándar de C ++ usa en Windows.

Si desea tener soporte para configuraciones regionales independientes de “comstackdor y plataforma” (y en realidad es mucho mejor soporte) eche un vistazo en Boost.Locale

Artyom

Aquí hay un nombre de ubicación que se puede utilizar 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 para 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 progtwig no tendrá el mismo resultado en todas partes; Lo bueno es que sus usuarios pueden pensar que funciona de la manera que desean.