【发布时间】:2013-11-01 10:26:07
【问题描述】:
我想读取和写入使用 CR LF 行分隔符 (L"\r\n") 的 utf-16 文件。使用 C++ (Microsoft Visual Studio 2010) iostreams。我希望写入流的每个 L"\n" 都透明地转换为 L"\r\n" 。使用 codecvt_utf16 语言环境方面需要以 ios::binary 模式打开 fstream,失去了通常的文本模式 \n 到 \r\n 的翻译。
std::wofstream wofs;
wofs.open("try_utf16.txt", std::ios::binary);
wofs.imbue(
std::locale(
wofs.getloc(),
new std::codecvt_utf16<wchar_t, 0x10ffff, std::generate_header>));
wofs << L"Hi!\n"; // i want a '\r' to be inserted before the '\n' in the output file
wofs.close();++
我想要一个不需要像 BOOST 这样的额外库的解决方案。
【问题讨论】:
-
您正在使用宽字符。宽字符不保证是 UTF-16。它们也可以是 UTF-32。所以,不要依赖它们。如果您使用的是 C++,请改用 char16_t。
-
@dbasic 虽然
char16_t是正确的解决方案,但VS2010 中的C++11 支持(以及因此char16_t类型)非常缺乏。 -
少了大约一年,或多或少几个月。他们当然可以因为没有编写时间机器而受到指责。
-
@HansPassant 虽然它确实是在标准发布之前制作的,但比赛确实有一些基于草稿的功能(最后几个草稿和最终规范之间的差异非常小)那个时候。
-
@JoachimPileborg:没错,但就像标准在功能完成后需要一些时间来完成一样,VS2010 也是如此。不过,我对 VS2012 不太宽容。
标签: c++ newline iostream utf-16 codecvt