关于windows下读取文件头有空白字符的问题

在工作中,有一次需要读取文件的内容,于是很自然地写下这样的读取代码:

BufferedReader readBuffer = new BufferedReader(new InputStreamReader(new FileInputStream(filePath)));

String s; 
while ((s = readBuffer.readLine()) != null) {
    //对字符串s进行解析
    ...
}

解析的过程,发现文件第一行总是无法正确解析。于是将第一行逐个字符打印出来,每个字符占一行。发现第一行第一个字符是空字符。

起始,我以为是首行开始多了一个空格,于是我对读取出来的内容加一个trim()操作,再次打印,这个空字符还是没有消除。

 

上网查了一翻,原来,首行的这个空字符是由于文件编码UTF-8-BOM造成的

UTF-8-BOM与UTF-8的区别,在于UTF-8-BOM的文件首会多一个空字符 “\uFEFF”。

所以,如果读取以UTF-8-BOM为编码方式的文件,那么第一行第一个字符会是空字符。

如果解析文件第一行的内容老是出错时,可以查下是否是这个问题。

如果是,解决办法是加上这样一句代码:

//把bom的空字符转化为空串
s = s.replace("\uFEFF", "");

 

那么,bom是什么?为什么UTF-8-BOM要在文件首加一个空字符?

首先,UTF-8-BOM除了文件首比UTF-8多了一个空字符外,其它和UTF-8是一样的。

BOM ,全称Byte Order Mark,翻译为“字节顺序标记”,维基百科上的解释如下:

当以UTF-16或UTF-32来将UCS/统一码字符所组成的字符串编码时,这个字符被用来标示其字节序。它常被用来当做标示文件是以UTF-8、UTF-16或UTF-32编码的标记。

但其实,在UTF-8中,并不一定需要BOM,比如linux系统就没有,但微软系统就有。

是微软系统故意跟Linux不兼容吗?不是的。

看知乎上的一个解释:

微软为什么用带 BOM 的 UTF-8,造成和多数系统的不兼容? - pansz的回答 - 知乎 https://www.zhihu.com/question/42048612/answer/93747146

 

他的结论是:

其实各个操作系统对待utf8的方式,都是与自己的过往设计,与自己的旧版本兼容,linux/osx是为了兼容unix的基础设计,windows则是为了兼容所有历史版本的windows。至于与其他操作系统兼容,并不是最重要的。他们做出这样的选择,从技术上都是必然的,不存在任何一方刻意制造不兼容一说。

 

以上内容参考:

1. https://blog.csdn.net/weixin_39640298/article/details/85127197

2. https://zh.wikipedia.org/wiki/%E4%BD%8D%E5%85%83%E7%B5%84%E9%A0%86%E5%BA%8F%E8%A8%98%E8%99%9F

3. https://blog.csdn.net/weixin_39640298/article/details/84573546

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章