Java讀取Unicode文件(UTF-8等)時碰到的BOM首字符問題,及處理方法


轉載:https://blog.csdn.net/clementad/article/details/47168573
2015-18-01修改:增加 apache commons io 處理方法。
 
在Windows下用文本編輯器創建的文本文件,如果選擇以UTF-8等Unicode格式保存,會在文件頭(第一個字符)加入一個BOM標識。
 
這個標識在Java讀取文件的時候,不會被去掉,而且String.trim()也無法刪除。如果用readLine()讀取第一行存進String里面,這個String的length會比看到的大1,而且第一個字符就是這個BOM。
 
這種情況會造成一些麻煩,比如在讀取ini文件的時候,如果想判斷第一行是不是以“[”開頭就無法正確判斷。
 
幸好,Java在讀取Unicode文件的時候,會統一把BOM變成“\uFEFF”,這樣的話,就可以自己手動解決了(判斷后,用substring()或replace()去除掉這個BOM):
  1.  
    if(line.startsWith("\uFEFF")){
  2.  
    //line = line.substring(1);
  3.  
    line = line.replace( "\uFEFF", "");
  4.  
    }
 
然而,這種方法並不是完美的,如果生成jar文件在windows下運行,還是有問題。終極的解決方法是使用apache commons io提供的BOMInputStream:
  1.  
    <dependency>
  2.  
    <groupId>commons-io</groupId>
  3.  
    <artifactId>commons-io</artifactId>
  4.  
    <version>2.4</version>
  5.  
    </dependency>

  1.  
    BufferedReader reader = null;
  2.  
    try {
  3.  
    //reader = new BufferedReader(new FileReader(file));
  4.  
     
  5.  
    //使用BOMInputStream自動去除UTF-8中的BOM!!!
  6.  
    reader = new BufferedReader(new InputStreamReader(new BOMInputStream(new FileInputStream(file))));
  7.  
     
  8.  
    String str = null;
  9.  
    //一次讀入一行(非空),直到讀入null為文件結束
  10.  
    while ((str = reader.readLine()) != null) {
  11.  
    }
 
什么是BOM?
BOM = Byte Order Mark
BOM是Unicode規范中推薦的標記字節順序的方法。比如說對於UTF-16,如果接收者收到的BOM是FEFF,表明這個字節流是Big-Endian的;如果收到FFFE,就表明這個字節流是Little-Endian的。
UTF-8不需要BOM來表明字節順序,但可以用BOM來表明“我是UTF-8編碼”。BOM的UTF-8編碼是EF BB BF(用UltraEdit打開文本、切換到16進制可以看到)。所以如果接收者收到以EF BB BF開頭的字節流,就知道這是UTF-8編碼了。
 
所有的BOM在C/C++/Java中都被處理為"\uFEFF"(???貌似不一定。。。),參考: http://www.fileformat.info/info/unicode/char/feff/index.htm
 
Wikipedia關於POM的說明介紹:
 
(原創文章,轉載請注明轉自Clement-Xu的博客: http://blog.csdn.net/clementad/article/details/47168573


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM