C++读取Windows生成文本文件时字符间出现多余空格如何解决
问题根因
出现的字符间多余空格不是文件里真实写入的空格,是编码读取不匹配导致的显示异常:
- 手动在Windows新建的文本文件默认是本地ANSI编码或者UTF-8编码,用fstream默认逻辑读取完全正常
- 部分Windows应用生成的文件默认用UTF-16 LE编码存储,每个英文字符占2字节,高字节固定为
0x00。用单字节编码模式读取时,这个0x00字节会被渲染成空白,看起来就像每个字符中间插了个空格。
原参考代码报错原因
参照网上方案修改的代码有三个直接触发编译/运行错误的问题:
codecvt_utf16的内部字符类型参数写错了:UTF-16是双字节宽字符编码,内部类型必须用wchar_t或者char16_t,传char作为模板参数本身就不符合类型要求,编译阶段直接报错- 接收读取内容的变量用错了:就算imbue配置正确,读取出来的宽字符内容也没法正确存到单字节的
std::string里,后续输出必然乱码 - 打开文件用了
ios::in|ios::out模式,如果目标文件不存在,out模式会直接创建空文件,反而会导致“文件不存在”的判断逻辑失效。
标准库原生解决方法
不需要引入第三方库,用C++标准库就能正确处理,分两种场景选择:
场景1:明确待读取文件是带BOM的UTF-16编码
直接用宽字符流读取,搭配正确的转码配置即可,参考代码:
#include <fstream> #include <string> #include <locale> #include <codecvt> #include <iostream> void read_config_file(const wchar_t* configuration_file) { std::wifstream file; std::wstring fileline; // 仅读场景只需要开ios::in模式 file.open(configuration_file, std::ios::in); // 正确配置UTF-16转码规则,自动识别BOM判断大小端 file.imbue(std::locale(file.getloc(), new std::codecvt_utf16<wchar_t, 0x10FFFF, std::consume_header>)); if (!file.is_open()) { print_progress("Configuration File does not exist\n"); return; } // 禁止用while(!file.eof())做循环判断,会重复读取最后一行 while (std::getline(file, fileline)) { // 如果需要输出到标准输出或者存为UTF-8字符串,加一层转码 std::wstring_convert<std::codecvt_utf8<wchar_t>> utf8_conv; std::string utf8_line = utf8_conv.to_bytes(fileline); std::cout << utf8_line << "\n"; } file.close(); }
注:C++17标准中
codecvt相关接口被标记为弃用,但目前全平台主流编译器(GCC、Clang、MSVC)仍完整支持,生产环境可以正常使用。
场景2:未知文件编码,需要兼容多编码格式
先读取文件前2-3个字节判断BOM头,再选择对应的读取逻辑:
- 前2字节为
0xFF 0xFE:UTF-16 LE编码,用上述宽字符流方案读取 - 前2字节为
0xFE 0xFF:UTF-16 BE编码,调整codecvt参数为大端序模式读取 - 前3字节为
0xEF 0xBB 0xBF:带BOM的UTF-8编码,跳过3个BOM字节后用普通单字节流读取 - 其他情况:按本地ANSI编码读取即可,不会出现空格异常。
编码兼容场景推荐库
如果需要兼容更多编码格式(比如GBK、Big5、无BOM的UTF-8/UTF-16等),不需要自己实现编码检测逻辑,直接使用成熟的开源库即可:
- utfcpp:轻量级头文件-only库,无额外依赖,专门处理UTF系列编码的识别与转换,适合仅需要兼容Unicode编码的轻量场景
- ICU:全平台通用的国际化组件库,支持全球所有主流文本编码,编码自动识别准确率极高,适合对兼容性要求高的大型生产项目
- Windows平台专属方案:可以直接调用系统自带的
MultiByteToWideChar/WideCharToMultiByteAPI,不需要引入额外依赖,对Windows平台原生应用生成的文件兼容性最好。
内容的提问来源于stack exchange,提问作者AndrewK
相关产品推荐
相关产品推荐

