C++ en_US.UTF-8 语言环境的 Windows 等效项是什么?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/4324542/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-28 15:07:33  来源:igfitidea点击:

What is the Windows equivalent for en_US.UTF-8 locale?

c++unicodeutf-8locale

提问by ?imon Tóth

If I want to make the following work on Windows, what is the correct locale and how do I detect that it is actually present: Does this code work universaly, or is it just my system?

如果我想在 Windows 上进行以下工作,正确的语言环境是什么,我如何检测它是否实际存在: 此代码是否通用,还是只是我的系统?

采纳答案by Nemanja Trifunovic

Basically, you are out of luck: http://www.siao2.com/2007/01/03/1392379.aspx

基本上,你运气不好:http: //www.siao2.com/2007/01/03/1392379.aspx

回答by Cubbi

Although there isn't good support for named locales, Visual Studio 2010 does include the UTF-8 conversion facets required by C++11: std::codecvt_utf8for UCS2 and std::codecvt_utf8_utf16for UTF-16:

尽管对命名语言环境没有很好的支持,但 Visual Studio 2010 确实包含了 C++11 所需的 UTF-8 转换方面:std::codecvt_utf8用于 UCS2 和std::codecvt_utf8_utf16用于 UTF-16:

#include <fstream>
#include <iostream>
#include <string>
#include <locale>
#include <codecvt>
void prepare_file()
{
    // UTF-8 data
    char utf8[] = {'\x7a',                       // latin small letter 'z' U+007a
                   '\xe6','\xb0','\xb4',         // CJK ideograph "water"  U+6c34
                   '\xf0','\x9d','\x84','\x8b'}; // musical sign segno U+1d10b
    std::ofstream fout("text.txt");
    fout.write(utf8, sizeof utf8);
}
void test_file_utf16()
{
    std::wifstream fin("text.txt");
    fin.imbue(std::locale(fin.getloc(), new std::codecvt_utf8_utf16<wchar_t>));
    std::cout << "Read from file using UTF-8/UTF-16 codecvt\n";
    for(wchar_t c; fin >> c; )
        std::cout << std::hex << std::showbase << c << '\n';
}
void test_file_ucs2()
{
    std::wifstream fin("text.txt");
    fin.imbue(std::locale(fin.getloc(), new std::codecvt_utf8<wchar_t>));
    std::cout << "Read from file using UTF-8/UCS2 codecvt\n";
    for(wchar_t c; fin >> c; )
        std::cout << std::hex << std::showbase << c << '\n';
}
int main()
{
    prepare_file();
    test_file_utf16();
    test_file_ucs2();
}

this outputs, on my Visual Studio 2010 EE SP1

这个输出,在我的 Visual Studio 2010 EE SP1 上

Read from file using UTF-8/UTF-16 codecvt
0x7a
0x6c34
0xd834
0xdd0b
Read from file using UTF-8/UCS2 codecvt
0x7a
0x6c34
0xd10b
Press any key to continue . . .

回答by MSalters

Per MSDN, it would be named "english_us.65001". But code page 65001 is somewhat flaky on Windows.

根据MSDN,它将被命名为“english_us.65001”。但是代码页 65001 在 Windows 上有点不稳定。