String xml = IOUtils.toString(new FileInputStream("c:/encoding.xml"));
如果IOUtils
是org.apache.commons.io.IOUtils
那麼它Javadoc說
「獲取InputStream的內容作爲使用默認的字符編碼的平臺的String。」
由於您保存爲cp1250,我猜cp1250也是您的平臺字符編碼。你的代碼將做的是
- 讀取文件的字節流
- 轉換的字節流使用CP1250(平臺編碼)
- 變換的字符爲Java內部表示字符(UTF-16)從UTF-16
- 轉換爲UTF-8
- 創建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。
這兩條經驗法則都與您選擇的編程語言無關。
也許生成的文件是有效的UTF-8? –
你如何添加和保存? – Mark
「如果任何字符的編碼不是UTF-8」不正確。除了UTF-8之外,'e'在大多數其他編碼中是一個有效的字符,甚至編碼也是一樣的。 –