You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C++将Unicode字符逐行存储到文本文件中?

解决UTF-16输出文本文件中换行符和转义字符乱码的问题

咱们直接说问题根因和解决方案——你遇到的乱码主要来自宽字符转义的错误写法和UTF-16编码下换行符的平台适配问题,结合你的代码片段,我来一步步帮你修正:

问题分析

  1. 错误的转义字符使用:你代码里的\263e是窄字符的八进制转义,塞进宽字符字符串L""里会被解析成错误的宽字符值,直接导致乱码,得统一用宽字符的十六进制转义L"\x263e"。
  2. 换行符的编码不匹配:用std::codecvt_utf16生成UTF-16文件时,\n(窄字符换行)会被转成单个宽字符0x000A,但Windows平台的文本文件通常认CRLF(即0x000D 0x000A),单个0x000A在UTF-16文件里很容易被记事本这类工具当成乱码,而非换行。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:25:06