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

C++ en_US.UTF-8语言环境的Windows等效项是什么?,c++,windows,unicode,utf-8,locale,C++,Windows,Unicode,Utf 8,Locale,如果我想在Windows上执行以下操作,正确的区域设置是什么,以及如何检测它实际存在: 根据,它将被命名为“english_us.65001”。但Windows上的代码页65001有点不稳定。根据,它将被命名为“english\u us.65001”。但是Windows上的代码页65001有点不稳定。基本上,您运气不好:基本上,您运气不好:尽管命名区域设置没有很好的支持,Visual Studio 2010包含C++11所需的UTF-8转换方面:std::codevt_utf8用于UCS2,而s

如果我想在Windows上执行以下操作,正确的区域设置是什么,以及如何检测它实际存在:
根据,它将被命名为“english_us.65001”。但Windows上的代码页65001有点不稳定。

根据,它将被命名为“english\u us.65001”。但是Windows上的代码页65001有点不稳定。

基本上,您运气不好:

基本上,您运气不好:

尽管命名区域设置没有很好的支持,Visual Studio 2010包含C++11所需的UTF-8转换方面:
std::codevt_utf8
用于UCS2,而
std::codevt_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();
}

尽管没有对命名区域设置的良好支持,Visual Studio 2010确实包含了C++11所需的UTF-8转换方面:
std::codevt\u utf8
用于UCS2,而
std::codevt\u utf8\u 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();
}
在过去,UTF-8(和其他一些代码页)不允许作为系统区域设置,因为

微软表示,UTF-8区域设置可能会破坏某些函数,因为这些函数的编写假定多字节编码每个字符使用的字节数不超过2个,因此,UTF-8(以及GB 18030、cp54936)等字节数更多的代码页不能设置为区域设置

然而,微软已经逐渐引入并开始再次推荐ANSI API(
-A
)而不是像以前那样的Unicode(
-W
)版本

直到最近,Windows还强调“Unicode”
-W
变体而不是
-A
API。但是,最近的版本使用了ANSI代码页和
-A
API作为向应用程序引入UTF-8支持的手段。如果ANSI代码页配置为UTF-8,
-A
API在UTF-8中运行。此模型的优点是支持使用
-A
api构建的现有代码,而无需任何代码更改


首先,他们添加了一个“Beta:使用Unicode UTF-8进行全球语言支持”复选框,因为Windows10Insider构建了17035,用于将区域设置代码页设置为UTF-8

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

启用后,您可以正常调用
setlocal

从Windows 10 build 17134(2018年4月更新)开始,Universal C运行时支持使用UTF-8代码页。这意味着传递给C运行时函数的
char
字符串将使用UTF-8编码。要启用UTF-8模式,请在使用
setlocale
时使用“UTF-8”作为代码页。例如,
setlocale(LC_ALL,“.utf8”)
将使用当前默认的Windows ANSI代码页(ACP)作为区域设置,使用UTF-8作为代码页

您也可以在较旧的Windows版本中使用此功能

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


2019年晚些时候,他们增加了程序使用UTF-8语言环境的能力,甚至不需要设置上面的UTF-8 beta标志。在使用MSVC编译时,您可以使用或选项,或者在appxmanifest中设置ActiveCodePage属性。在过去,UTF-8(以及一些其他代码页)不允许作为系统区域设置,因为

微软表示,UTF-8区域设置可能会破坏某些函数,因为这些函数的编写假定多字节编码每个字符使用的字节数不超过2个,因此,UTF-8(以及GB 18030、cp54936)等字节数更多的代码页不能设置为区域设置

然而,微软已经逐渐引入并开始再次推荐ANSI API(
-A
)而不是像以前那样的Unicode(
-W
)版本

直到最近,Windows还强调“Unicode”
-W
变体而不是
-A
API。但是,最近的版本使用了ANSI代码页和
-A
API作为向应用程序引入UTF-8支持的手段。如果ANSI代码页配置为UTF-8,
-A
API在UTF-8中运行。此模型的优点是支持使用
-A
api构建的现有代码,而无需任何代码更改


首先,他们添加了一个“Beta:使用Unicode UTF-8进行全球语言支持”复选框,因为Windows10Insider构建了17035,用于将区域设置代码页设置为UTF-8

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

启用后,您可以正常调用
setlocal

从Windows 10 build 17134(2018年4月更新)开始,Universal C运行时支持使用UTF-8代码页。这意味着传递给C运行时函数的
char
字符串将使用UTF-8编码。要启用UTF-8模式,请在使用
setlocale
时使用“UTF-8”作为代码页。例如,
setlocale(LC_ALL,“.utf8”)
将使用当前默认的Windows ANSI代码页(ACP)作为区域设置,使用UTF-8作为代码页

您也可以在较旧的Windows版本中使用此功能

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



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

您可以对“有点古怪”发表更多评论吗?@Let_Me_Be:很抱歉,我不能比@MSalters更好地概括它,但我只是找不到任何当前和d的内容