[ Java 常見問題] Handle UTF8 file with BOM - 程式扎記

文章推薦指數: 80 %
投票人數:10人

參考至 這裡. Preface : 編碼問題一直是編程人員處理上很頭痛的問題, 特別是在處理 BOM 的時候. 舉例來說, 考慮有一個UTF-8 編碼檔案內容如下: 標籤 [英文學習] [計算機概論] [深入雲計算] [雜七雜八] [AlgorithminJava] [DataStructureswithJava] [IRClass] [Java文章收集] [Java代碼範本] [Java套件] [JVM應用] [LFDNote] [MangoDB] [MathCC] [MongoDB] [MySQL小學堂] [Python考題] [Python常見問題] [Python範例代碼] [心得扎記] [網路教學] [C常見考題] [C範例代碼] [C/C++範例代碼] [IntroAlg] [Java代碼範本] [Java套件] [Linux小技巧] [Linux小學堂] [Linux命令] [MLInAction] [ML] [MLP] [Postgres] [Python學習筆記] [QuickPython] [SoftwareEngineering] [Thepythontutorial] 工具收集 設計模式 資料結構 ActiveMQInAction AI Algorithm Android Ansible AWS BigData研究 C/C++ C++ CCDH CI/CD Coursera Database DB DesignPattern DeviceDriverProgramming Docker Docker工具 DockerPractice Eclipse EnglishWriting ExtJS3.x FP FraudPrevention FreeBSD GCC Git GitPro GNU Golang Gradle Groovy Hadoop Hadoop.HadoopEcosystem Java JavaFramework JavaUI JavaIDE JavaScript Jenkins JFreeChart Kaggle Kali/Metasploit Keras KVM LearnSpark LeetCode Linux Lucene Math ML MLUdemy Mockito MPI Nachos Network NLP nodejs OO OpenCL OpenMP OSC OSGi Pandas Perl PostgreSQL PyDS Python Python自製工具 PythonStdLibrary Pythontools QEMU R RealPython RIA RTC Ruby RubyPackages Scala ScalaIA SQLAlchemy TensorFlow Tools UML Unix Verilog Vmware Windows技巧 wxPython 2012年7月17日星期二 [Java常見問題]HandleUTF8filewithBOM 參考至 這裡 Preface: 編碼問題一直是編程人員處理上很頭痛的問題,特別是在處理 BOM 的時候.舉例來說,考慮有一個UTF-8編碼檔案內容如下:  如果你用Hexmode打開可以看到最前面有UTF-8的BOM: 0xEF0xBB0xBF  而更完整的UTF系列BOM表可以參考下圖(擷取自Wiki):  事實上BOM表的用途是用來決定程式在讀取文字檔時, endianness (byteorder)的方向與文字檔的編碼方式, 並且BOM是Optional的!意味程式在處理時需要自己判斷是否文字檔有包含BOM,如果不處理就可能會出現亂碼.如果我們以 BufferedReader 來讀取上面的文字檔,代碼如下: -ReadUTF8.java:  viewplaincopytoclipboardprint? package test.kw;      import java.io.BufferedReader;   import java.io.FileInputStream;   import java.io.InputStreamReader;      public class ReadUTF8{          /**      *@paramargs      */       public static void main(String[]args) throws Exception{           FileInputStreamfis= new FileInputStream("utf8.txt");           BufferedReaderbr= new BufferedReader(new InputStreamReader(fis,"UTF8"));           Stringline;           while((line=br.readLine())!=null)           {               System.out.printf("\t[Info]Read:%s\n",line);           }           br.close();       }      }   這時候如果你將上面類別包裝成jar檔,執行它.會發現讀出內容有亂碼,其實那就是BOM造成的:  事實上在Javabugdatabase有對應的record存在: "UTF-8encodingdoesnotrecognizeinitialBOM" 與 "UTF-8decoderhandlingofbyte-ordermarkhaschanged" Solution: 在現有的Solution上,可以考慮 ApacheIOCommons 中的一個類別 BOMInputStream.透過它,你可以設定BOM的自動detection並在detection出來後將之從bytestream中省略以避免上面看到的亂碼.或者你可以自己處理.下面為上一個範例的改善,在第一行遇到UTF-8的BOM時將之忽略並將輸出 -UTF8ToAnsiUtils.java:  viewplaincopytoclipboardprint? package test.kw;      import java.io.BufferedReader;   import java.io.FileInputStream;   import java.io.InputStreamReader;      public class ReadUTF8{       //FEFFbecausethisistheUnicodecharrepresentedbytheUTF-8byteordermark(EFBBBF).       public static final StringUTF8_BOM= "\uFEFF";          /**      *@paramargs      */       public static void main(String[]args) throws Exception{           FileInputStreamfis= new FileInputStream("utf8.txt");           BufferedReaderbr= new BufferedReader(new InputStreamReader(fis,"UTF8"));           Stringline;           boolean firstLine= true;           while((line=br.readLine())!=null)           {               if(firstLine)line=removeUTF8BOM(line);               System.out.printf("\t[Info]Read:%s\n",line);           }           br.close();       }          private static StringremoveUTF8BOM(Strings){           if (s.startsWith(UTF8_BOM)){               s=s.substring(1); //如果String是以BOM開頭,則省略字串最前面的第一個字元.           }           return s;       }   }   接著將之包裝為test.jar並將main-class設為上面的類別,如下執行可以發現亂碼不建了:  Supplement: * ByteordermarkscrewsupfilereadinginJava * Utf-8SourceFileEncodingforJava 於 7月17,2012 以電子郵件傳送這篇文章BlogThis!分享至Twitter分享至Facebook分享到Pinterest 標籤: [Java代碼範本], Java 沒有留言: 張貼留言 較新的文章 較舊的文章 首頁 訂閱: 張貼留言(Atom) [Mockito]Mockito’sMockMethods  Sourcefrom hereOverviewInthistutorial,we'll illustratethevarioususesofthestandardstaticmockmethodsoftheMockitoAPI... [C文章收集]BitwiseOperation 轉載自 這裡 前言: 歡迎來到二進位的世界。

電腦資料都是以二進位儲存,想當然程式語言的變數也都是以二進位儲存。

在C/C++當中有幾個位元運算子:<>SHIFTRIGHT、&AND、... [VerilogTutorial]行為模型的敘述:always,if/else,case與forloop Preface: 在這個階層中,我們只需考慮電路模組的功能,而不需考慮其硬體的詳細內容.Verilog的時序控制為以事件為基礎的時序控制: * 接線或暫存器的值被改變。

* 模組的輸入埠接收到新的值* 正規... [Linux命令]du:顯示目錄或是檔案的大小 屬性: 系統相關-檔案與目錄 語法: du[參數][檔案] 參數|功能 -a|顯示目錄中個別檔案的大小-b|以bytes為單位顯示-c|顯示個別檔案大小與總和-D|顯示符號鏈結的來源檔大小-h|Hum...



請為這篇文章評分?