如何用C++将Unicode字符逐行存储到文本文件中?
解决UTF-16输出文本文件中换行符和转义字符乱码的问题
咱们直接说问题根因和解决方案——你遇到的乱码主要来自宽字符转义的错误写法和UTF-16编码下换行符的平台适配问题,结合你的代码片段,我来一步步帮你修正:
问题分析
- 错误的转义字符使用:你代码里的
\263e是窄字符的八进制转义,塞进宽字符字符串L""里会被解析成错误的宽字符值,直接导致乱码,得统一用宽字符的十六进制转义L"\x263e"。 - 换行符的编码不匹配:用
std::codecvt_utf16生成UTF-16文件时,\n(窄字符换行)会被转成单个宽字符0x000A,但Windows平台的文本文件通常认CRLF(即0x000D 0x000A),单个0x000A在UTF-16文件里很容易被记事本这类工具当成乱码,而非换行。 endl的额外干扰:endl会插入换行并刷新缓冲区,但它插的也是单个L'\n',同样会触发上面的换行识别问题。
修正后的代码
#include <fstream> #include <locale> #include <codecvt> int main() { std::wofstream wof; // 保留UTF-16带BOM的编码配置 wof.imbue(std::locale(std::locale::empty(), new std::codecvt_utf16<wchar_t, 0x10ffff, std::generate_header>)); wof.open(L"file3.txt"); // 使用L"\r\n"作为宽字符换行,修正转义字符写法 wof << L"Test.\x263a \x263c \x263d \x263e A:B:C, 我一个人来 人人都爱喝可乐。 " << L"\r\n"; wof << L"\r\n Another test. \x002c \x263a \x263e" << L"\r\n"; wof << L"\r\n 我一个人来。 一个人 我一个人来 人人都爱喝可乐。" << L"\r\n"; wof << L" Test \x263a \x263c \x263d \x263e 我一个人来 人人都爱喝可乐。 " << L"\r\n"; wof << L"\r\n 我一个人来 人人都爱喝可乐。" << L"\r\n"; wof.close(); return 0; }
关键修改点
- 替换所有
\n为L"\r\n":确保UTF-16文件的换行符符合Windows文本文件的CRLF标准,避免被识别为乱码。 - 修正转义字符:把
\263e改成L"\x263e",保证是宽字符的十六进制转义,对应正确的Unicode字符。 - 用
L"\r\n"替代endl:避免endl自动插入的单个L'\n',如果需要刷新缓冲区,手动调用wof.flush()即可。
验证小技巧
保存文件后用记事本打开时,确认编码选择为Unicode(UTF-16),就能正确显示所有字符和换行符了。
内容的提问来源于stack exchange,提问作者Khushboo
相关产品推荐
相关产品推荐

