C++ en_US.UTF-8语言环境的Windows等效项是什么?
如果我想在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
根据,它将被命名为“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的内容