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

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)