我正在尝试制作一个简单的程序来枚举我的磁盘上的文件,但我仍然坚持使用伟大的UTF前沿。
我正在使用boost :: recursive_directory_iterator枚举文件。这很好用,但Windows设置为“法国加拿大”,许多文件和目录都有法语字符(如é,è,ç)。这些文件名在屏幕上显示不正确,我正在使用wcout。我看到一个'▒'而不是尖锐的chars。甚至boost :: filesystem :: ifstream也无法打开这些文件。
我尝试添加“std :: locale :: global(std :: locale(”“))”,但最初只抛出异常。我发现当LANG在执行程序时设置为“”时,前一个命令不再抛出,但它只设置“C”语言环境而不是操作系统使用的一个(我希望是“ fr_CA.UTF-8“或”fr_CA.ISO8859-1“)。 LANG的任何其他值都会将异常带回......
在i18n世界中使用cygwin gcc程序必须做些什么?
我写这个来测试各种区域设置ID:
#include <iomanip>
#include <iostream>
#include <locale>
using namespace std;
void tryLocale(string ID)
{
try{
cout << "Trying " << std::setw(18) << std::left << "\"" + ID + "\" ";
std::locale Loc(ID.c_str());
cout << "OK (" << Loc.name() << ")" << endl;
}catch(...){
cout << "FAIL" << endl;
}
}
const char *Locales[] = { "", "fr", "fr_CA", "fr_CA.UTF-8", "fr_CA.ISO8859-1", "C", 0};
int main()
{
cout << "Classic = " << std::locale::classic().name() << endl << endl;
int i = 0;
do
{ tryLocale(Locales[i]);
} while(Locales[++i]);
return 0;
}
这给了我这个输出(没有任何LANG或LC_ALL):
Classic = C
Trying "" FAIL
Trying "fr" FAIL
Trying "fr_CA" FAIL
Trying "fr_CA.UTF-8" FAIL
Trying "fr_CA.ISO8859-1" FAIL
将LANG设置为“”,第一个“尝试”变为
Trying "" OK (C)
抛出的异常打印出来:
terminate called after throwing an instance of 'std::runtime_error'
what(): locale::facet::_S_create_c_locale name not valid