2012-11-27 52 views
0

我有一種方法,其中一個輸入屬性是String xml。我只想爲該xml的編碼創建控制。如果任何字符使用其他UTF-8編碼,則會引發錯誤。當字符串未以UTF-8編碼時拋出異常

你能告訴我如何創建和測試它的最簡單方法嗎?

我用這樣的:

String xml = IOUtils.toString(new FileInputStream("c:/encoding.xml")); 
Document doc = builder.parse(IOUtils.toInputStream(xml, "UTF-8")); 

添加像L,S,T,Z,L,S,T,Z,並保存爲CP1250文件的信件。

但沒有錯誤。

我做錯了什麼?

+0

也許生成的文件是有效的UTF-8? –

+1

你如何添加和保存? – Mark

+0

「如果任何字符的編碼不是UTF-8」不正確。除了UTF-8之外,'e'在大多數其他編碼中是一個有效的字符,甚至編碼也是一樣的。 –

回答

2

這不能在Java中本地完成。一個文件只是一串字節,它們可以被解釋,但是你覺得,Java默認無法增加意義。我建議使用這個庫(不,我沒有寫):

http://code.google.com/p/juniversalchardet/

按照這些指令(從複製該鏈接粘貼):

如何使用它

  1. 構建org.mozilla.universalchardet.UniversalDetector的實例。
  2. 通過呼叫UniversalDetector.handleData()將一些數據(通常爲幾千字節)送入檢測器。
  3. 通過致電UniversalDetector.dataEnd()通知檢測器結束數據。
  4. 通過調用UniversalDetector.getDetectedCharset()來獲取檢測到的編碼名稱。
  5. 在重新使用檢測器實例之前,不要忘記調用UniversalDetector.reset()
1
String xml = IOUtils.toString(new FileInputStream("c:/encoding.xml")); 

如果IOUtilsorg.apache.commons.io.IOUtils那麼它Javadoc

「獲取InputStream的內容作爲使用默認的字符編碼的平臺的String。」

由於您保存爲cp1250,我猜cp1250也是您的平臺字符編碼。你的代碼將做的是

  1. 讀取文件的字節流
  2. 轉換的字節流使用CP1250(平臺編碼)
  3. 變換的字符爲Java內部表示字符(UTF-16)從UTF-16
  4. 轉換爲UTF-8
  5. 創建XML文檔

這將永遠正常運行CP1250 實ly是您的文件編碼,UTF-16具有cp1250中的每個字符,而UTF-8具有UTF-16中的每個字符。

如果你想讀的字節爲UTF-8,避免自動轉換,你應該使用的IOUtils.toString()兩個參數變異體的一種:

public static String toString(InputStream input, Charset encoding) 

public static String toString(InputStream input, String encoding) 

所以我會嘗試:

// Helper import: I always forget if the constant is "UTF8" or "UTF-8" 
import org.apache.commons.lang.CharEncoding; 

String xml = IOUtils.toString(new FileInputStream("c:/encoding.xml"), CharEncoding.UTF_8); 
Document doc = builder.parse(IOUtils.toInputStream(xml, CharEncoding.UTF_8)); 

這裏的經驗法則是:從來沒有做任何字節到字符串/字符串到字節轉換沒有指定源/目的地編碼。

一個較小的經驗法則是:除非你需要需要來使用其他一些編碼,否則在任何地方都要使用UTF-8。

這兩條經驗法則都與您選擇的編程語言無關。