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'在大多数其他编码中是一个有效的字符,甚至编码也是一样的。 –