utf-8 with bom格式的文件

前言

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

示例

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

utf-8 with bom格式的文件_第1张图片

使用Java读取这个文件

utf-8 with bom格式的文件_第2张图片

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

utf-8 with bom格式的文件_第3张图片 

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

原理解析

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

utf-8 with bom格式的文件_第4张图片

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

utf-8 with bom格式的文件_第5张图片

utf-8 with bom格式的文件_第6张图片

 各个语言遵循相同的规范

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

总结

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

你可能感兴趣的:(数据结构,golang,java)