如何使用C++在 Win 上写入和读取 UTF16 文件
How to write and read UTF16 file on Win using C++
关于
这一点,SO有很多问题,但大多数都没有提到将wstring写回文件。例如,我发现这是为了阅读:
// open as a byte stream
std::wifstream fin("/testutf16.txt", std::ios::binary);
// apply BOM-sensitive UTF-16 facet
fin.imbue(std::locale(fin.getloc(),
new std::codecvt_utf16<wchar_t, 0x10ffff, std::consume_header>));
// read
std::wstring ws;
for(wchar_t c; fin.get(c); )
{
std::cout << std::showbase << std::hex << c << 'n';
ws.push_back(c);
}
我尝试了类似的东西来写作:
std::wofstream wofs("/utf16dump.txt", std::ios::binary);
wofs.imbue(std::locale(wofs.getloc(),
new std::codecvt_utf16<wchar_t, 0x10ffff, std::consume_header>));
wofs << ws;
但它会产生垃圾,(或者 Notpad++ 和 vim 无法解释它)。正如标题 Im on Win, native C++, VS 2010 所述。
输入文件:
t€stUTF16✡
test
结果如下:
t€stUTF16✡
test
转换为十六进制:
0000000: 7400 ac20 7300 7400 5500 5400 4600 3100 t.. s.t.U.T.F.1.
0000010: 3600 2127 0d00 0a00 7400 6500 7300 7400 6.!'....t.e.s.t.
0000020: 0a
...
VIM 正常输出:
t^@¬ s^@t^@U^@T^@F^@1^@6^@!'^M^@ ^@t^@e^@s^@t^@
编辑:我最终使用了 UTF8。Andrei Alexandrescu说这是最好的编码,所以没有太大的损失。:)
你的类似代码 - 不是。 您删除了std::ios::binary
样式,尽管文档说
字节流应写入二进制文件;如果写入文本文件,则可能会损坏。
ASCII模式下的NL->CRLF转换不会对UTF-16文件做漂亮的事情,因为它将插入一个字节0x0D而不是两个字节0x00 0x0D。
如果你使用C++11
标准很容易(因为有很多额外的包含,如"utf8"
可以永远解决这个问题)。
但是如果你想使用具有旧标准的多平台代码,你可以使用此方法编写流:
- 阅读有关流的 UTF 转换器的文章
- 从上述来源向项目添加
stxutif.h
-
在 ANSI 模式下打开文件,并将 BOM 表添加到文件的开头,如下所示:
std::ofstream fs; fs.open(filepath, std::ios::out|std::ios::binary); unsigned char smarker[3]; smarker[0] = 0xEF; smarker[1] = 0xBB; smarker[2] = 0xBF; fs << smarker; fs.close();
-
然后按
UTF
打开文件并在那里写入您的内容:std::wofstream fs; fs.open(filepath, std::ios::out|std::ios::app); std::locale utf8_locale(std::locale(), new utf8cvt<false>); fs.imbue(utf8_locale); fs << .. // Write anything you want...
对于输出,您希望使用 generate_header
而不是 consume_header
。
请参阅 http://en.cppreference.com/w/cpp/locale/codecvt_mode
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 使用新行和不使用新行读取文件
- 读取文件并输入到矢量中
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 无法找到/读取配置文件.conf-FileIOException
- 如何使用Luacneneneba API正确读取字符串和表参数
- C++将文本文件中的数据读取到结构数组中
- 正在将csv文件读取为双精度矢量
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 为什么在读取文件大小时文件IO速度会发生变化
- 正在读取二进制文件(is_open)
- 如何在c++中从文本文件中逐行读取整数
- SSH通过/sbin/SSH无法读取RSA密钥文件(从控制台运行)
- 独立读取-修改-写入顺序
- 从文本文件中读取时钟时间和事件时间并进行处理
- 如何从文本文件中读取值和数组
- 读取进程内存无法正常工作,使用 UTF16 字符串
- 如何使用C++在 Win 上写入和读取 UTF16 文件