PRo*_*eau 5 c++ gcc cygwin locale
我正在尝试制作一个简单的程序来枚举磁盘上的文件,但是我却停留在UTF的前沿。
我正在使用boost :: recursive_directory_iterator枚举文件。效果很好,但是Windows设置为“加拿大法语”,并且许多文件和目录都带有法语字符(例如é,è,ç)。这些文件名未在屏幕上正确显示,我正在使用wcout。我看到一个“?” 而不是尖锐的字符。即使boost :: filesystem :: ifstream也无法打开这些文件。
我试图添加“ std :: locale :: global(std :: locale(“”)))“,但起初只抛出一个异常。我发现,当在执行程序时将LANG设置为“”时,先前的命令不会再抛出任何异常,而是仅设置“ C”语言环境,而不是被OS使用(我希望是“ fr_CA.UTF-8”或“ fr_CA.ISO8859-1”)。LANG的任何其他值都会使异常返回...
要使Cygwin gcc程序在i18n世界中可用,必须做些什么?
我写了这个来测试各种语言环境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;
}
Run Code Online (Sandbox Code Playgroud)
这给了我这个输出(没有任何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
Run Code Online (Sandbox Code Playgroud)
将LANG设置为“”,第一个“ trying”变为
Trying "" OK (C)
Run Code Online (Sandbox Code Playgroud)
抛出的异常打印如下:
terminate called after throwing an instance of 'std::runtime_error'
what(): locale::facet::_S_create_c_locale name not valid
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1088 次 |
| 最近记录: |