[英]throw exception when string is not encoded in UTF-8
我有一种方法,其中输入属性之一是String xml。 我只想为该xml的编码创建控件。 如果任何字符使用UTF-8以外的其他编码,将引发错误。
您能告诉我最简单的方法来创建和测试它吗?
我用过这样的东西:
String xml = IOUtils.toString(new FileInputStream("c:/encoding.xml"));
Document doc = builder.parse(IOUtils.toInputStream(xml, "UTF-8"));
添加了Ľ,Š,Ť,Ž,ľ,š,ť,ž等字母并将其另存为cp1250文件。
但没有错误。
我究竟做错了什么?
这不能用Java本地完成。 文件只是一串字节,可以解释,但是您感觉,Java默认情况下无法添加含义。 我建议使用此库(不,我没有写过):
http://code.google.com/p/juniversalchardet/
请遵循以下说明(从该链接粘贴的副本):
org.mozilla.universalchardet.UniversalDetector
的实例。 UniversalDetector.handleData()
将一些数据(通常是几千个字节)提供给检测器。 UniversalDetector.dataEnd()
通知检测器数据结束。 UniversalDetector.getDetectedCharset()
获得检测到的编码名称。 UniversalDetector.reset()
。 String xml = IOUtils.toString(new FileInputStream("c:/encoding.xml"));
如果此IOUtils
为org.apache.commons.io.IOUtils
则其Javadoc表示
“使用平台的默认字符编码 ,以String的形式获取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。
这些经验法则都与您选择的编程语言无关。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.