繁体   English   中英

如果字符串未使用UTF-8编码,则抛出异常

[英]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/

请遵循以下说明(从该链接粘贴的副本):

如何使用它

  1. 构造一个org.mozilla.universalchardet.UniversalDetector的实例。
  2. 通过调用UniversalDetector.handleData()将一些数据(通常是几千个字节)提供给检测器。
  3. 通过调用UniversalDetector.dataEnd()通知检测器数据结束。
  4. 通过调用UniversalDetector.getDetectedCharset()获得检测到的编码名称。
  5. 在重用检测器实例之前,请不要忘记调用UniversalDetector.reset()
String xml = IOUtils.toString(new FileInputStream("c:/encoding.xml")); 

如果此IOUtilsorg.apache.commons.io.IOUtils则其Javadoc表示

“使用平台的默认字符编码 ,以String的形式获取InputStream的内容。”

当您另存为cp1250时,我想cp1250也是您的平台字符编码。 您的代码将要做的是

  1. 读取文件作为字节流
  2. 使用cp1250(平台编码)将字节流转换为chars
  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。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM