C++程序stdout重定向后出现怪异字符与多余空字符问题
问题根因
你观测到的异常是Windows PowerShell的默认重定向行为导致的,和你的C++代码读写逻辑无关:
- 开头固定的
ÿþ是UTF-16 LE编码的字节序标记(BOM,对应字节0xFF 0xFE) - 字符之间的多余
\0是UTF-16编码的特征:单个ASCII字符会用2个字节存储,高位字节补0,所以你会看到每个可见字符后面跟着一个隐藏的\0 - PowerShell在使用
>操作符重定向程序输出到文件时,默认会把程序输出的字节流转成UTF-16 LE编码后再写入文件,哪怕你的程序输出的是纯ASCII内容也会被强制转码,这就是你不管用std::cout、printf还是手动拼字符数组输出都有相同问题的原因。
解决方案
任选以下任意一种方案即可解决:
- 修改PowerShell本次会话的默认重定向编码,执行重定向前先运行:
之后运行$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'main.exe > my_log.txt生成的就是正常的UTF-8编码文件 - 直接在CMD而非PowerShell中执行重定向命令,CMD默认不会修改程序输出的字节流,直接写入原内容
- 不需要shell重定向的话,直接在C++代码中用
std::ofstream写输出到目标文件,完全绕开shell的转码逻辑 - 如果需要固定程序输出行为不受shell影响,可以在C++代码main函数开头强制指定控制台输出编码:
#include <windows.h> int main() { SetConsoleOutputCP(CP_UTF8); // 原有业务逻辑 }
额外代码优化建议
你现有代码中的while (!my_file.eof())写法存在逻辑问题,会导致多读一行空内容,建议改成:
std::string line; while (std::getline(my_file, line)) { // 解析line的逻辑 }
内容的提问来源于stack exchange,提问作者user2840470
相关产品推荐
相关产品推荐

