前言
经常使用配置文件,一般而言是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,所以需要注意,同时需要注意编码,如果用非当前编码的编码解析文件,中文就会乱码。