[ Java 常見問題] Handle UTF8 file with BOM - 程式扎記
文章推薦指數: 80 %
參考至 這裡. 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++當中有幾個位元運算子:<
* 模組的輸入埠接收到新的值* 正規...
[Linux命令]du:顯示目錄或是檔案的大小
屬性: 系統相關-檔案與目錄 語法: du[參數][檔案] 參數|功能 -a|顯示目錄中個別檔案的大小-b|以bytes為單位顯示-c|顯示個別檔案大小與總和-D|顯示符號鏈結的來源檔大小-h|Hum...
延伸文章資訊
- 1Java - How to add and remove BOM from UTF-8 file
1. Add BOM to a UTF-8 file ... To Add BOM to a UTF-8 file, we can directly write Unicode \ufeff o...
- 2[ Java 常見問題] Handle UTF8 file with BOM - 程式扎記
參考至 這裡. Preface : 編碼問題一直是編程人員處理上很頭痛的問題, 特別是在處理 BOM 的時候. 舉例來說, 考慮有一個UTF-8 編碼檔案內容如下:
- 3Java处理UTF-8文件的BOM头部 - CSDN博客
Java处理UTF-8文件的BOM头部BOM——Byte Order Mark,就是字节序标记。基本概念在UCS 编码中有一个叫做”ZERO WIDTH NO-BREAK SPACE“的字符,它...
- 4Java處理UTF-8帶BOM的文本的讀寫 - 網頁設計教學
BOM(byte-order mark),即字節順序標記,它是插入到以UTF-8、UTF16或UTF-32編碼Unicode文件開頭的特殊標記,用來識別Unicode文件的編碼類型。
- 5Handle UTF8 file with BOM - Real's Java How-to
UTF8 file are a special case because it is not recommended to add a BOM to them. The presence of ...