當前位置:編程學習大全網 - 源碼下載 - java如何獲得文件編碼格式

java如何獲得文件編碼格式

java課程設計實例

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(文件);

byte[]?b?=?新的?字節[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

?*/

公?靜電?字符串?getFileEncode(字符串?路徑)?{

/*

?*?檢測器是壹個檢測器,它將檢測任務交給壹個特定檢測實現類的實例。

?*?CpDetector內置了壹些常用的檢測實現類,可以通過add方法訪問這些檢測實現類的實例。添加進來,如ParsingDetector、

?*?JChardetFacade、ASCIIDetector、UnicodeDetector .

?*?檢測器按照“誰先返回非空檢測結果,以結果為準”的原則返回檢測結果。

?*?字符集編碼。有三個第三方JAR包:antlr.jar、chardet.jar和cpdetector.jar

?*?CpDetector基於統計學原理,不保證完全正確。

?*/

CodepageDetectorProxy?探測器?=?codepagedetectorproxy . getinstance();

/*

?*?ParsingDetector可用於檢查HTML、XML等文件或字符流的編碼,構造方法中的參數用於

?*?指示是否顯示檢測過程的詳細信息,否則不顯示。

?*/

detector.add(新?parsing detector(false));

/*

?*?JChardetFacade封裝了Mozilla組織提供的JChardet,可以完成大部分文件的編碼。

?*?決心。所以壹般來說,有了這個探測器,妳就可以滿足大部分項目的要求了。如果妳不放心,可以。

?*?再添加幾個檢測器,比如下面的ASCIIDetector和UnicodeDetector。

?*/

detector . add(jchardetfacade . getinstance());//?使用antlr.jar、chardet.jar

//?ASCII檢測器用於ASCII編碼確定。

detector . add(ascii detector . 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?!=?空)

回歸?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

?*/

公?靜電?字符串?getFileEncode(URL?網址)?{

/*

?*?檢測器是壹個檢測器,它將檢測任務交給壹個特定檢測實現類的實例。

?*?CpDetector內置了壹些常用的檢測實現類,可以通過add方法訪問這些檢測實現類的實例。添加進來,如ParsingDetector、

?*?JChardetFacade、ASCIIDetector、UnicodeDetector .

?*?檢測器按照“誰先返回非空檢測結果,以結果為準”的原則返回檢測結果。

?*?字符集編碼。有三個第三方JAR包:antlr.jar、chardet.jar和cpdetector.jar

?*?CpDetector基於統計學原理,不保證完全正確。

?*/

CodepageDetectorProxy?探測器?=?codepagedetectorproxy . getinstance();

/*

?*?ParsingDetector可用於檢查HTML、XML等文件或字符流的編碼,構造方法中的參數用於

?*?指示是否顯示檢測過程的詳細信息,否則不顯示。

?*/

detector.add(新?parsing detector(false));

/*

?*?JChardetFacade封裝了Mozilla組織提供的JChardet,可以完成大部分文件的編碼。

?*?決心。所以壹般來說,有了這個探測器,妳就可以滿足大部分項目的要求了。如果妳不放心,可以。

?*?再添加幾個檢測器,比如下面的ASCIIDetector和UnicodeDetector。

?*/

detector . add(jchardetfacade . getinstance());//?使用antlr.jar、chardet.jar

//?ASCII檢測器用於ASCII編碼確定。

detector . add(ascii detector . getinstance());

//?UnicodeDetector用於確定unicode家族編碼

detector . add(unicode detector . getinstance());

java.nio.charset.Charset?字符集?=?null

試試?{

字符集?=?detector . detect code page(URL);

}?接住?(例外?ex)?{

ex . printstacktrace();

}

如果?(charset?!=?空)

回歸?charset . name();

其他

回歸?null

}

網址?網址?=?createstattreemodel . class . get resource("/resource/"?+?“配置文件”);

URLConnection?urlConnection?=?URL . open connection();

inputStream = URL connection . getinputstream();

字符串?charsetName?=?getfile encode(URL);

system . out . println(charset name);

BufferedReader?在?=?新的?BufferedReader(新?InputStreamReader(inputStream,charset name));

3.通過調用任何輸入文本流的重載形式來檢測其編碼:?

Charset =檢測器。檢測代碼頁(要測試的文本輸入流,測量讀取該流所需的字節數);?

以上字節數由程序員指定。字節越多,決定越準確,當然花費的時間也越長。請註意,指定的字節數不能超過文本流的最大長度。

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直接轉碼。

方法三:如果想靈活的自動檢測代碼,可以使用上面介紹的方法來確定屬性文件的代碼,方便開發人員的工作。

補充:您可以使用以下代碼來獲得Java支持編碼集:

Charset.availableCharsets()。keySet();

您可以使用以下代碼獲取系統默認代碼:

charset . default charset();

  • 上一篇:知乎(知識類)APP的體驗創新
  • 下一篇:如何優雅地在github上貢獻代碼
  • copyright 2024編程學習大全網