我有一个方法,其中一个输入属性是String xml。我只是想为该xml的编码创建控件。如果任何字符在UTF-8的其他编码中,则会抛出错误。
请告诉我如何创建和测试它的最简单方法?
我使用过这样的东西:
String xml = IOUtils.toString(new FileInputStream("c:/encoding.xml"));
Document doc = builder.parse(IOUtils.toInputStream(xml, "UTF-8"));
添加了Ľ,Š,Ť,Ž,ľ,š,ť,ž等字母,并将其保存为cp1250文件。
但没有错误。
我做错了什么?
答案 0 :(得分:2)
这不能在Java中本地完成。一个文件只是一个字节串,但是你可以解释它们,默认情况下Java无法添加含义。我建议使用这个库(不,我没有写它):
http://code.google.com/p/juniversalchardet/
按照以下说明操作(从该链接粘贴的副本):
org.mozilla.universalchardet.UniversalDetector
。UniversalDetector.handleData()
将一些数据(通常为几千字节)提供给检测器。UniversalDetector.dataEnd()
。UniversalDetector.getDetectedCharset()
获取检测到的编码名称。UniversalDetector.reset()
。 答案 1 :(得分:1)
String xml = IOUtils.toString(new FileInputStream("c:/encoding.xml"));
如果此IOUtils
为org.apache.commons.io.IOUtils
,则其Javadoc表示
“使用平台的默认字符编码将InputStream的内容作为字符串获取。”
当您保存为cp1250时,我猜cp1250也是您的平台字符编码。你的代码将做的是
这将始终有效,因为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。
这两条经验法则都与您选择的编程语言无关。