標籤:
如何判斷java.io.File所讀取的檔案編碼 問題
java中涉及到檔案讀取,就經常要考慮檔案編碼問題。雖然程式中一般都指定UTF-8編碼,但是使用者總可能提交各種編碼的檔案(特別是windows下使用者),如果對這些檔案不做判斷就直接按照UTF-8的方式讀取的話,是肯定會亂碼的。
解決方案
java原生並不支援檔案編碼的判斷,一般都是read檔案的前幾個位元組來判斷,需要自己編寫工具類,判斷的編碼類別型也比較少。最近找到了個開源的項目juniversalchardet,能比較優雅的完成這個任務。
使用方法也很簡單,下載它的jar包,按照官網的例子操作即可,當然這段代碼自己封裝成工具類最好了:
import org.mozilla.universalchardet.UniversalDetector;public class TestDetector { public static void main(String[] args) throws java.io.IOException { byte[] buf = new byte[4096]; String fileName = args[0]; java.io.FileInputStream fis = new java.io.FileInputStream(fileName); // (1) UniversalDetector detector = new UniversalDetector(null); // (2) int nread; while ((nread = fis.read(buf)) > 0 && !detector.isDone()) { detector.handleData(buf, 0, nread); } // (3) detector.dataEnd(); // (4) String encoding = detector.getDetectedCharset(); if (encoding != null) { System.out.println("Detected encoding = " + encoding); } else { System.out.println("No encoding detected."); } // (5) detector.reset(); }}
我自己寫成工具類測試的時候,發現有些檔案還是不能判斷出來(比如excel儲存過的gbk編碼的.csv檔案),所以使用它判斷檔案編碼的時候,最好處理下得不到編碼的情況,比如給個預設編碼啥的。
juniversalchardet的項目地址
- googlecode
- github
如何判斷java.io.File所讀取的檔案編碼