utf-8 with bom格式的文件

本文探讨了UTF-8 with BOM格式文件在读取时可能出现的额外空格问题,以及它如何导致配置文件解析错误。BOM(Byte Order Mark)在UTF-8编码中是一个特殊字符,可能导致不兼容问题。建议使用无BOM的UTF-8格式以避免潜在问题。

前言

经常使用配置文件,一般而言是utf-8,少量的GBK等,实际上utf-8还有一种utf-8 with bom格式,那么这种格式有什么区别,什么是BOM呢。

示例

创建一个utf-8 with BOM的格式文件

使用Java读取这个文件

可以看到我们创建文件时并没有空格,而实际读取文件后莫名有个空格,使用go语言试试

 

仍然有空格,那么空格是怎么来的呢,为啥是空格,文件保存时明明没有空格

原理解析

实际上这个空格就是BOM的占位符,在字符串中,表示为空格,如果使用utf-8无BOM格式,这个空格是不存在的,经常配置文件是不能有BOM的,因为很多第3方中间件或者SDK并没有针对BOM处理,为了避免麻烦,尽量使用无BOM的根式文件。

debug发现读取的utf-8 with bom的开头是带有\uFEFF的字符的,当然我这里是openJDK8,如果是JDK9及以上,就是byte[]存储了,毕竟在一定情况下,byte[]比char[]省空间,而JDK很多情况就是char[]数组占用大量内存。

 各个语言遵循相同的规范

进一步发现,解析出来的空格实际上是ZWNBSP(zero-width no-break space),这个字符,它的编码正是0xFEFF,即\uFEFF,就是BOM字符。如果文件是utf-8编码,使用这个字符可以判断文件是否utf-8 with bom文件。

总结

实际上utf-8 with BOM就是编码文件前,带个空白的字符,实际上缺很容易造成配置文件的读取解析问题,毕竟不是所有sdk、中间件等做了BOM解析,而且目前绝大部分文件编码都是utf-8,所以需要注意,同时需要注意编码,如果用非当前编码的编码解析文件,中文就会乱码。

<think> 嗯,用户的问题是关于在Visual Studio中将源码文件UTF-8 with BOM改为UTF-8 without BOM后无法正常编译的解决方案。我需要结合用户提供的多个引用信息来解答这个问题。 用户引用的资料提到几个关键点:MSVC编译器原生不支持UTF-8 without BOM格式(引用3),会导致C4819警告和诡异的注释问题(引用3),但在VS2015 Update2之后可以通过/utf-8编译选项解决(引用4)。用户还提到VS2017的类似问题(引用5)。 根据这些信息,解决方案的核心应该是: 1. 升级到较新的VS版本(至少VS2015 Update2) 2. 添加/utf-8编译选项 3. 或者保留BOM避免兼容性问题 用户特别强调"无法正常编译",所以需要着重解决编译错误而非仅显示问题。引用3提到的"编译失败"和"代码执行错误"都是关键症状。 考虑到用户可能是跨平台开发者(引用3提到Qt推荐UTF-8 without BOM),应该优先推荐/utf-8方案而非回退到BOM。但也要给出保守方案供旧版本用户选择。 需要特别注意引用4提到的具体操作路径:"属性→C/C++→所有选项→附加选项添加/utf-8",这个实操指引很重要。同时要提醒用户升级VS版本的前提条件,避免在旧版本无效操作。 </think> 在 Visual Studio 中将源码文件UTF-8 with BOM 改为 UTF-8 without BOM 后出现编译错误,主要原因是 MSVC 编译器对无 BOMUTF-8 支持存在缺陷。以下是完整解决方案: ### 一、核心解决方案(推荐) 1. **添加编译选项** 在项目属性中强制指定 UTF-8 编码: - 右击项目 → 属性 → C/C++ → 所有选项 - 找到 **"附加选项"** → 输入 `/utf-8` - 保存设置后重新编译 *(此方案适用于 VS2015 Update2 及以上版本,可彻底解决编译和字符显示问题)[^4]* 2. **修改高级保存选项** 避免 VS 自动转换编码: - 文件 → 高级保存选项 → 选择 **"Unicode (UTF-8 无签名) - 代码页 65001"** - 对所有源码文件执行此操作[^1] --- ### 二、替代方案(兼容旧版本) 1. **回退到 UTF-8 with BOM** - 文件 → 另存为 → 保存时选择 **"UTF-8 with BOM"** 格式 - 适用于跨平台要求不高的项目[^1] 2. **版本降级兼容** 若使用 VS2015 以下版本: - 方法 1:升级到 VS2015 Update2 或更高版本[^4] - 方法 2:在代码首行添加 BOM 签名(十六进制 `EF BB BF`) --- ### 三、修复由编码引发的编译错误 当出现以下典型问题时: - **C4819 警告**(字符无法在当前代码页表示) - **注释吞噬换行符**(中文字符后的代码被注释) - **中文输出乱码** 需同时配置两项: ```powershell 1. 项目属性 → C/C++ → 命令行:添加 `/utf-8` 2. 项目属性 → 链接器 → 系统 → 子系统:控制台 → 设置 `/SUBSYSTEM:CONSOLE` ``` --- ### 根本原因分析 | 问题类型 | 触发条件 | 解决方案 | |----------------|--------------------------|----------------------| | **编译失败** | 无 BOM + 多字节字符 | 添加 `/utf-8` 编译选项 [^4] | | **输出乱码** | 控制台未启用 UTF-8 模式 | 设置控制台子系统 | | **注释错误** | 中文字符截断换行符 | 升级编译器或添加 BOM [^3] | > ⚠️ 重要提示:若项目需在 Linux 编译,必须使用 UTF-8 without BOM;若仅限 Windows 平台,保留 BOM 可避免兼容性问题[^1][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值