2010-07-10 8 views
5

Je tente d'instancier un objet std::locale avec la chaîne de caractères locale américaine ou britannique.
Les deux std::locale loc("en_US") et std::locale loc("en_GB") jettent un mauvais nom de locale exception d'exécution. La création d'une locale en utilisant "" ou "C" fonctionne correctement; Toutefois, j'ai des problèmes pour définir les paramètres régionaux d'un pays.Pourquoi std :: locale loc ("en_US") renvoie une exception?

La raison pour laquelle je voudrais faire cela est pour des tests unitaires, pour m'assurer qu'une collection de méthodes de tri de chaînes fonctionne correctement.

Je tiens également à souligner que je suis en train de coder dans Windows en utilisant Visual Studio 2008 et que je souhaite conserver mon code multi-plateforme, si possible.

Répondre

6

Les chaînes std::locale sont spécifiques à l'implémentation; il se peut que l'implémentation ne supporte pas la chaîne que vous passez en argument.

Puisque vous programmez dans Windows, vous pouvez vous intéresser à Language Strings, qui répertorie les identificateurs de langue utilisés par setlocal et Country/Region Strings pour les identificateurs de pays. Autant que je puisse voir, les identificateurs de langage utilisent un tiret (par exemple en-US, nl-BE, et zh-HK).

Vous pouvez trouver plus d'informations sur std::locale::global(std::locale("zh-CN")) Gets "Bad locale name"??

+2

J'ai remarqué que mon VC++ 2012 express accepte maintenant "en-US", mais jette encore sur "en_US" . –

5

Vous mieux utiliser boost.locale qui utilise la bibliothèque ICU pour cela. ICU fournit de nombreux paramètres régionaux et ne dépend pas du système d'exploitation que vous utilisez. Pour générer std :: paramètres régionaux vous devez écrire:

boost::locale::generator gen; 
std::locale loc = gen("en_US"); 

Pour plus d'informations: http://www.boost.org/doc/libs/1_57_0_b1/libs/locale/doc/html/index.html