`
yuaqian2003
  • 浏览: 13272 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

UTF8格式中的BOM问题

    博客分类:
  • java
阅读更多
    昨天在编写程序过程中碰到一个问题,分词组件在加载词典时(词典文件是以UTF-8格式保存的txt文件),词典里的第一个词却找不到;跟踪进去后发现在加载词典时,第一个词的长度莫名的变长了一位,当时以为是带有空格或换行符,加了trim操作和去换行符,测试后问题依旧;


    后来在网上google了一下,最终发现问题是由于Utf-8编码格式的文件所导致,如果Utf-8的文件被记事本、DW工具编辑过,但没有注意处理的方式,那么会自动在Utf-8文件中添加BOM格式,以表示文件是Utf-8编码的文件。

    unicode编码为65279的字符叫“ZERO WIDTH NO-BREAK SPACE”即没有宽度的空格符,本质上也是null值,但是不同于null。byte-order mark(BOM)是位于码点U+FEFF的统一码字符的名称。当以UTF-16或UTF-32来将UCS/统一码字符所组成的字符串编码时,这个字符被用来标示其字节序。它常被用来当做标示文件是以UTF-8、UTF-16或UTF-32编码的记号。说白了就是位于文本最前面用来标识该unicode编码的文本内容是以UTF-8、UTF-16或UTF-32编码的。通过查询发现windows的记事本程序在打开文本内容后会自动添加BOM。(这部分摘自http://lwjlaser.iteye.com/blog/1319220)

    因此,在编辑、更改任何文本文件时,请务必使用不会乱加BOM的编辑器。Linux下的编辑器应该都没有这个问题。WINDOWS下,请勿使用记事本等编辑器。推荐的编辑器是: Editplus 2.12版本以上; EmEditor; UltraEdit(需要取消‘添加BOM’的相关选项); Dreamweaver(需要取消‘添加BOM’的相关选项) 等。
对于已经添加了BOM的文件,要取消的话,可以用以上编辑器另存一次。(Editplus需要先另存为gb,再另存为UTF-8。)
DW解决办法如下:
用DW打开指定文件,按Ctrl+J->标题/编码->编码选择“UTF-8”,去掉"包括Unicode签名(BOM)"勾选->保存/另存为,即可!
 
   或者另外一种办法就是在程序中读取文件时做下判断,看是否需要去掉第一行的第一个char,代码如下:
     InputStreamReader FS = new InputStreamReader(in, "UTF-8");
     BufferedReader SR = new BufferedReader(FS); // 文件输入流为
     String strLine = SR.readLine();
     if (strLine.length()>1){
     if ((int)strLine.charAt(0)==65279){
       strLine=strLine.substring(1);
     }
   }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics