c++ - 是否可以将文本文件设置为UTF-16?

标签 c++ windows unicode text-files utf-16

我的文本编写代码适用于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/

相关文章:

c++ - 如何在 C++ 中生成没有重复的正态分布?

windows - 为什么 OSX 在 amd64 间接跳转时出现总线错误?

java - 实时服务器/客户端应用程序滞后

ios - NSString大小不考虑希腊呼吸痕

MySQL 将 ÅÄÖ 视为 AAO?

c++ - 通过循环c++将单个字符与字符串中的字符进行比较的问题

c++ - 使用 <wincrypt.h> 加密解密期间丢失字符

c++ - 为什么在语句中的其他任何地方都没有使用该值的情况下使用++i 而不是 i++ ?

linux - 我们如何避免 Git 中 windows 和 linux 用户之间的文件命名冲突?

python - PyPE ansi 还是 unicode?