当我插入带有重音符号的字符串时,它不会显示在文件" FAKE.txt" (UTF-16编码)
std::wifstream ifFake("FAKE.txt", std::ios::binary);
ifFake.imbue(std::locale(ifFake.getloc(),
new std::codecvt_utf16<wchar_t, 0x10ffff, std::consume_header>));
if (!ifFake)
{
std::wofstream ofFake("FAKE.txt", std::ios::binary);
ofFake << L"toc" << std::endl;
ofFake << L"salut" << std::endl;
ofFake << L"autre" << std::endl;
ofFake << L"êtres" << std::endl;
ofFake << L"âpres" << std::endl;
ofFake << L"bêtes" << std::endl;
}
结果(FAKE.txt) TOC 萨吕 AUTRE
其他重音词未写入(我猜是流错误)。
程序是用g ++编译的,源文件编码是UTF-8。
我注意到控制台输出的行为相同。
我该如何解决?
答案 0 :(得分:1)
因为您没有imbue
ofFake
的区域设置。
下面的代码应该运行良好:
std::wofstream ofFake("FAKE.txt", std::ios::binary);
ofFake.imbue(std::locale(ofFake.getloc(),
new std::codecvt_utf16<wchar_t, 0x10ffff, std::generate_header>));
ofFake << std::wstring(L"toc") << std::endl;
ofFake << L"salut" << std::endl;
ofFake << L"autre" << std::endl;
ofFake << L"êtres" << std::endl;
ofFake << L"âpres" << std::endl;
ofFake << L"bêtes" << std::endl;
虽然,只有MSVC ++二进制文件才会生成UTF-16编码文件。 g ++二进制文件似乎是一个带有一些无用BOM的UTF8编码文件。
因此,我建议改用utf8:
std::wofstream ofFake("FAKE.txt", std::ios::binary);
ofFake.imbue(std::locale(ofFake.getloc(), new std::codecvt_utf8<wchar_t>));
ofFake << L"toc" << std::endl;
ofFake << L"salut" << std::endl;
ofFake << L"autre" << std::endl;
ofFake << L"êtres" << std::endl;
ofFake << L"âpres" << std::endl;
ofFake << L"bêtes" << std::endl;