如何在cygwin下使用gcc设置std :: locale?

时间:2011-10-20 01:11:54

标签: c++ gcc cygwin locale

我正在尝试制作一个简单的程序来枚举我的磁盘上的文件,但我仍然坚持使用伟大的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

0 个答案:

没有答案