不输出带有重音符号的宽字符串
wide strings with accents are not outputted
当我插入带有重音符号的字符串时,它没有显示在文件中 "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)
目录
敬礼
他
剩下的重音字没写(我猜是流错误)
程序是用g++编译的,源文件编码是UTF-8。
我注意到控制台输出有相同的行为。
我该如何解决?
因为您没有 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;
当我插入带有重音符号的字符串时,它没有显示在文件中 "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) 目录 敬礼 他
剩下的重音字没写(我猜是流错误)
程序是用g++编译的,源文件编码是UTF-8。
我注意到控制台输出有相同的行为。
我该如何解决?
因为您没有 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;