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

时间:2010-12-01 12:52:38

标签: c++ unicode utf-8 locale

如果我想在Windows上进行以下工作,那么正确的语言环境是什么?如何检测它实际存在: Does this code work universaly, or is it just my system?

4 个答案:

答案 0 :(得分:12)

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

#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();
}

此输出,在我的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 . . .

答案 1 :(得分:10)

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

答案 2 :(得分:3)

过去,由于系统区域设置,不允许使用UTF-8(和其他一些代码页)

Microsoft说,UTF-8语言环境可能会破坏某些功能,因为编写它们时假定多字节编码每个字符使用的字节数不超过2个字节,因此对具有更多字节的代码页进行编码,例如UTF-8(以及GB 18030,cp54936 )无法设置为语言环境。

https://en.wikipedia.org/wiki/Unicode_in_Microsoft_Windows#UTF-8

但是Microsoft逐渐引入了UTF-8 locale support,并开始再次推荐ANSI API(-A),而不是像以前那样推荐Unicode(-W


首先,他们添加了一个“测试版:使用Unicode UTF-8为全球语言提供支持” 复选框,因为Windows 10内部人员内部版本17035将区域设置代码页设置为UTF-8

Beta: Use Unicode UTF-8 for worldwide language support

要打开该对话框,请打开开始菜单,键入“区域”,然后选择“ 区域设置”>“其他日期,时间和区域设置”>“更改日期,时间或数字格式”>“管理”

启用它后,您可以正常呼叫setlocal

Universal C Runtime从Windows 10内部版本17134(2018年4月更新)开始,支持使用UTF-8代码页。这意味着传递给C运行时函数的char字符串应采用UTF-8编码的字符串。要启用UTF-8模式,请在使用setlocale时将“ UTF-8”用作代码页。例如,setlocale(LC_ALL, ".utf8")将对语言环境使用当前的默认Windows ANSI代码页(ACP),对于代码页将使用UTF-8。

UTF-8 Support

您也可以在Windows的较早版本中使用它

要在Windows 10之前的操作系统(例如Windows 7)上使用此功能,必须使用app-local deployment或使用Windows SDK版本17134或更高版本进行静态链接。对于17134之前的Windows 10操作系统,仅支持静态链接。


2019年晚些时候,他们增加了程序使用UTF-8语言环境的能力,甚至无需在上面设置UTF-8 beta标志。使用MSVC编译时,可以使用/execution-charset:utf-8/utf-8选项,也可以在appxmanifest中设置ActiveCodePage属性

答案 3 :(得分:1)

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