1

我有输入属性之一是 String xml 的方法。我只想为该 xml 的编码创建控件。如果任何字符采用 UTF-8 的其他编码,则会引发错误。

你能告诉我如何创建和测试它的最简单方法吗?

我用过这样的东西:

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

添加Ľ,Š,Ť,Ž,ľ,š,ť,ž等字母并将其保存为cp1250文件。

但没有错误。

我究竟做错了什么?

4

2 回答 2

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()在重用检测器实例之前不要忘记调用。
于 2012-11-27T14:10:22.243 回答
1
String xml = IOUtils.toString(new FileInputStream("c:/encoding.xml")); 

如果这IOUtilsorg.apache.commons.io.IOUtils那么它的Javadoc

“使用平台的默认字符编码将 InputStream 的内容作为字符串获取。”

当您保存为 cp1250 时,我猜 cp1250 也是您的平台字符编码。你的代码要做的是

  1. 将文件作为字节流读取
  2. 使用 cp1250(平台编码)将字节流转换为字符
  3. 将字符转换为 Java 内部表示 (UTF-16)
  4. 从 UTF-16 转换为 UTF-8
  5. 创建 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。

这两个经验法则都与您选择的编程语言无关。

于 2012-11-27T15:06:04.497 回答