如果我想在Windows上进行以下工作,那么正确的语言环境是什么?如何检测它实际存在: Does this code work universaly, or is it just my system?
答案 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)
答案 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
要打开该对话框,请打开开始菜单,键入“区域”,然后选择“ 区域设置”>“其他日期,时间和区域设置”>“更改日期,时间或数字格式”>“管理”
启用它后,您可以正常呼叫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。
您也可以在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上有点不稳定。