我的文本编写代码适用于ANSI字符,但是当我尝试编写日语字符时,它们不会出现。我需要使用UTF-16编码吗?如果是这样,我将如何在代码上做到这一点?
std::wstring filename;
std::wstring text;
filename = "path";
wofstream myfile;
myfile.open(filename, ios::app);
getline(wcin, text);
myfile << text << endl;
wcin.get();
myfile.close();
最佳答案
从注释看来,您的控制台似乎正确理解了Unicode,而问题仅在于文件输出。
这是使用UTF-16LE编写文本文件的方法。刚刚在MSVC 2019中进行了测试,并且可以正常工作。
#include <string>
#include <fstream>
#include <iostream>
#include <codecvt>
#include <locale>
int main() {
std::wstring text = L"test тест 試験.";
std::wofstream myfile("test.txt", std::ios::binary);
std::locale loc(std::locale::classic(), new std::codecvt_utf16<wchar_t, 0x10ffff, std::little_endian>);
myfile.imbue(loc);
myfile << wchar_t(0xFEFF) /* UCS2-LE BOM */;
myfile << text << "\n";
myfile.close();
}
您必须在Windows下使用std::ios::binary
模式进行输出,否则\n
会通过扩展为\r\n
来破坏它,最终发出3个字节而不是2个字节。您不必在一开始就编写BOM,但是拥有BOM可以大大简化使用文本编辑器中的正确编码打开文件的过程。
不幸的是,自C++ 17起,就不推荐使用
std::codecvt_utf16
而不替换它(是的,C++中的Unicode支持太糟糕了)。关于c++ - 是否可以将文本文件设置为UTF-16?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63999142/