前言
经常使用配置文件,一般而言是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,所以需要注意,同时需要注意编码,如果用非当前编码的编码解析文件,中文就会乱码。
本文探讨了UTF-8 with BOM格式文件在读取时可能出现的额外空格问题,以及它如何导致配置文件解析错误。BOM(Byte Order Mark)在UTF-8编码中是一个特殊字符,可能导致不兼容问题。建议使用无BOM的UTF-8格式以避免潜在问题。
982

被折叠的 条评论
为什么被折叠?



