Java如何獲得文件編碼格式
1:簡單判斷是否是UTF-8。因為除了UTF-8之外,它通常是GBK,所以默認情況下它被設置為GBK。
當根據給定的字符集存儲文件時,可以將編碼信息存儲在文件的前三個字節中。因此,基本原理是通過讀取文件的前三個字節並判斷這些字節的值可以知道編碼格式。事實上,如果項目的平臺是中文操作系統,如果這些文本文件是在項目中生成的,也就是說,開發人員可以控制文本的編碼格式,只要他們確定兩種通用編碼:GBK和UTF-8。由於中文視窗的默認編碼是GBK,因此通常只需確定UTF-8編碼格式。
對於UTF-8編碼格式的文本文件,前三個字節的值為-17、-69和-65,因此判斷是否為UTF-8編碼格式的代碼片段如下:
文件?文件?=?新的?文件(路徑);
InputStream?in=?新的?java.io.FileInputStream(文件);
字節【】?b?=?新的?byte【3】;
in . read(b);
in . close();
如果?(b【0】?==?-17?& amp& amp?b【1】?==?-69?& amp& amp?b【2】?==?-65)
system . out . println(file . getname()?+?“:編碼為UTF-8“);
其他
system . out . println(file . getname()?+?“:可能是GBK或其他代碼“);
2.如果您想實現更復雜的文件編碼檢測,可以使用開源項目cpdetector,其網站為:/。它的類庫非常小,只有500K左右。cpDetector基於統計原理,並不能保證完全正確。使用該類庫判斷文本文件的代碼如下:
讀取外部文件(首先使用cpdetector檢測文件的編碼格式,然後使用檢測到的編碼方法讀取文件):
/**
?*?使用第三方開源包cpdetector獲取文件編碼格式
?*?
?*?@param?小路
?*確定文件編碼格式的源文件的路徑。
?*?@作者?黃磊
?*?@版本?2012-7-12?14:05
?*/
公共的?靜電?字符串?getfilencode(String?路徑)?{
/*
?*?檢測器是壹個檢測器,它將檢測任務交給特定檢測實現類的實例。
?*?CpDetector內置了壹些常用的檢測實現類,可以通過add方法訪問這些檢測實現類的實例。插件,如ParsingDetector、
?*?JChardetFacade、ASCIIDetector、UnicodeDetector。
?*?檢測器按照“誰先返回非空檢測結果,以結果為準”的原則返回檢測結果。
?*?字符集編碼。有三個第三方JAR包:antlr.jar、chardet.jar和cpdetector.jar
?*?CpDetector基於統計原理,並不保證完全正確。
?*/
CodepageDetectorProxy?探測器?=?codepagedetectorproxy . getinstance();
/*
?*?ParsingDetector可用於檢查HTML、XML和其他文件或字符流的編碼,構造方法中的參數用於
?*?指示是否顯示檢測過程的詳細信息,如果不顯示則為false。
?*/
detector.add(新的?parsing detector(false);
/*
?*?JChardetFacade封裝了Mozilla組織提供的JChardet,可以完成大部分文件的編碼。
?*?決心。因此,壹般來說,使用這種探測器可以滿足大多數項目的要求。如果妳不放心,妳可以。
?*?再添加幾個檢測器,例如下面的ascii檢測器和unicode檢測器。
?*/
detector . add(jchardetfacade . getinstance());//?使用antlr.jar、chardet.jar
//?ASCII檢測器用於ASCII編碼確定。
detector . add(asciiidetector . getinstance());
//?UnicodeDetector用於確定unicode家族編碼
detector . add(unicode detector . getinstance());
java.nio.charset.Charset?字符集?=?null
文件?f?=?新的?文件(路徑);
試試?{
字符集?=?detector . detect code page(f . touri()。toURL());
}?接住嗎?(例外?ex)?{
ex . printstacktrace();
}
如果?(字符集?!=?空)
回歸?charset . name();
其他
回歸?null
}
字符串?charsetName?=?getfile encode(config file path);
system . out . println(charset name);
inputStream?=?新的?FileInputStream(配置文件);
BufferedReader?在?=?新的?BufferedReader(新?InputStreamReader(inputStream,?charset name));
讀取jar包內的資源文件(首先使用cpdetector檢測jar內資源文件的編碼格式,然後以檢測到的編碼模式讀取文件):
/**
?*?使用第三方開源包cpdetector獲取URL對應的文件代碼。
?*?
?*?@param?小路
?*確定文件編碼格式的源文件的URL。
?*?@作者?黃磊
?*?@版本?2012-7-12?14:05
?*/
公共的?靜電?字符串?getfilencode(URL?網址)?{
/*
?*?檢測器是壹個檢測器,它將檢測任務交給特定檢測實現類的實例。
?*?CpDetector內置了壹些常用的檢測實現類,可以通過add方法訪問這些檢測實現類的實例。插件,如ParsingDetector、
?*?JChardetFacade、ASCIIDetector、UnicodeDetector。
?*?檢測器按照“誰先返回非空檢測結果,以結果為準”的原則返回檢測結果。
?*?字符集編碼。有三個第三方JAR包:antlr.jar、chardet.jar和cpdetector.jar
?*?CpDetector基於統計原理,並不保證完全正確。
?*/
CodepageDetectorProxy?探測器?=?codepagedetectorproxy . getinstance();
/*
?*?ParsingDetector可用於檢查HTML、XML和其他文件或字符流的編碼,構造方法中的參數用於
?*?指示是否顯示檢測過程的詳細信息,如果不顯示則為false。
?*/
detector.add(新的?parsing detector(false);
/*
?*?JChardetFacade封裝了Mozilla組織提供的JChardet,可以完成大部分文件的編碼。
?*?決心。因此,壹般來說,使用這種探測器可以滿足大多數項目的要求。如果妳不放心,妳可以。
?*?再添加幾個檢測器,例如下面的ascii檢測器和unicode檢測器。
?*/
detector . add(jchardetfacade . getinstance());//?使用antlr.jar、chardet.jar
//?ASCII檢測器用於ASCII編碼確定。
detector . add(asciiidetector . getinstance());
//?UnicodeDetector用於確定unicode家族編碼
detector . add(unicode detector . getinstance());
java.nio.charset.Charset?字符集?=?null
試試?{
字符集?=?detector . detect code page(URL);
}?接住嗎?(例外?ex)?{
ex . printstacktrace();
}
如果?(字符集?!=?空)
回歸?charset . name();
其他
回歸?null
}
網址?網址?=?createstationtreemodel . class . get resource(“/resource/“?+?“配置文件”);
URLConnection?urlConnection?=?URL . open connection();
inputStream = URL connection . getinputstream();
字符串?charsetName?=?getfilencode(URL);
system . out . println(charset name);
BufferedReader?在?=?新的?BufferedReader(新?InputStreamReader(inputStream,?charset name));
3.通過調用任何輸入文本流的重載形式來檢測其編碼:?
字符集=檢測器。檢測代碼頁(要測試的文本輸入流,並測量讀取該流所需的字節數);?
上述字節數由程序員指定。字節越多,決策越準確,當然花費的時間也越長。請註意,指定的字節數不能超過文本流的最大長度。
4.確定文件編碼的具體應用示例:
屬性文件(。properties)是Java程序中常見的文本存儲方法。STRUTS框架使用屬性文件來存儲程序中的字符串資源。其內容如下:
#註釋聲明
屬性名=屬性值
讀取屬性文件的壹般方法是:
FileInputStream?ios =新?FileInputStream(“屬性文件名“);
屬性?道具=新?properties();
prop . load(IOs);
字符串?Value=prop.getProperty(“屬性名稱“);
IOs . close();
使用java.io.Properties的load方法讀取屬性文件很方便,但是如果屬性文件中有中文,那麽讀取後會發現亂碼。原因是load方法使用字節流讀取文本,讀取後需要將字節流編碼為字符串,它使用的編碼是“iso-8859-1”,這是壹個ASCII字符集,不支持中文編碼。
方法1:使用顯式轉碼:
字符串?Value=prop.getProperty(“屬性名稱“);
字符串?encValue=new?字符串(值。getbytes(“ISO-8859-1“)“屬性文件的實際編碼“);
方法2:如果這個屬性文件在項目內部,我們可以控制屬性文件的編碼格式。例如,如果采用Windows中默認的gbk,我們可以直接使用“GBK”進行轉碼。如果合同采用UTF-8,請使用UTF-8直接轉碼。
方法3:如果您想靈活地自動檢測代碼,可以使用上述方法來確定屬性文件的代碼,從而方便開發人員的工作。
補充:您可以使用以下代碼獲得Java支持編碼集:
Charset.availableCharsets()。keySet();
您可以使用以下代碼獲取系統默認代碼:
charset . default charset();