String xml = IOUtils.toString(new FileInputStream("c:/encoding.xml"));
如果这IOUtils
是org.apache.commons.io.IOUtils
那么它的Javadoc说
“使用平台的默认字符编码将 InputStream 的内容作为字符串获取。”
当您保存为 cp1250 时,我猜 cp1250 也是您的平台字符编码。你的代码要做的是
- 将文件作为字节流读取
- 使用 cp1250(平台编码)将字节流转换为字符
- 将字符转换为 Java 内部表示 (UTF-16)
- 从 UTF-16 转换为 UTF-8
- 创建 XML 文档
这将始终有效,因为 cp1250确实是您的文件编码,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。
这两个经验法则都与您选择的编程语言无关。