2012-11-27 25 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。

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