【问题标题】:Handling UTF-8 encoding处理 UTF-8 编码
【发布时间】:2010-09-21 02:49:49
【问题描述】:

我们有一个在 Weblogic 服务器上运行的 Java 应用程序,它从 JMS 或 MQ 队列中提取 XML 消息并将其写入另一个 JMS 队列。应用程序不会以任何方式修改 XML 内容。我们使用 BEA 的 XMLObject 来读取消息并将消息写入队列。

XML 消息包含编码类型声明为 UTF-8。

当 XML 包含超出正常 ASCII 范围的字符(例如 £ 符号)时,我们会遇到问题。当从队列中读取消息时,我们可以看到 £ 符号是完整的,但是一旦我们将其写入目标队列, £ 符号就会丢失并被替换为 £。

我检查了操作系统级别设置(区域设置),一切似乎都很好。我还应该检查什么以确保不会发生这种情况?

【问题讨论】:

    标签: java xml unicode encoding utf-8


    【解决方案1】:

    您应该使用InputStreamOutputStreambyte[] 来处理XML 文档,而不是ReaderWriterString。在 JMS 的世界中,BytesMessageTextMessage 更适合 XML 负载。

    每个 XML 文档都在内部指定其字符编码,所有 XML 处理 API 都面向获取字节流,并在必要时找出正确的字符编码以供自己使用。基于文本的 API 只是在那里......我猜是为了迷惑人们!无论如何,应用程序应该让 XML 处理器处理字符编码问题,而不是试图自己管理它(或使用面向文本的 API,但对字符编码问题没有深入了解)。

    【讨论】:

      【解决方案2】:

      一旦我们将其写入目标队列,£ 符号就会丢失并被替换为 £

      这告诉我字符被写入为 UTF-8,但它被 读取 就好像它是像 ISO-8859-1 这样的单字节编码. (对于 U+00A0..U+00BF 范围内的任何字符,如果将其编码为 UTF-8 并将其解码为 ISO-8859-1,则最终会得到两个字符序列 ÃX,其中 X 是原始字符。)我会查看接收 JMS 队列的编码设置。

      【讨论】:

      • 是的。这是编码设置的问题,不是在 JMS 队列中,而是在操作系统级别(我认为这是正确的,并在我的原始查询中提到过)。
      • 我很高兴你明白了,我希望你接受其他回复中提供的建议:如果你真的必须自己进行字节/字符转换,你应该总是指定编码而不是依赖操作系统设置。
      • "对于 U+00A0..U+00BF 范围内的任何字符,如果将其编码为 UTF-8 并将其解码为 ISO-8859-1,则最终会得到两个字符序列 ÃX,其中 X 是原始字符。”你能再解释一下吗?
      • This table 展示了如何通过将其位分布在两个或多个字节上并添加适当的前缀来转换代码点。对于U+0080..U+00FF 范围内的代码点,UTF-8 编码的第二个字节与两个高位被10 覆盖的代码点相同。但是U+0080..U+00BF 范围内的那些已经以10 开头,因此第二个字节与代码点相同。这就是为什么,如果你解码不正确,看起来有人在你的某些角色前面添加了Ã
      【解决方案3】:

      如果没有更多细节,我猜有一种方法可以选择在未指定的地方采用编码,并且默认为 ISO-8859-1。通常,检查 InputStream/OutputStream 和 Reader/Writer 之间传递的任何内容。

      例如,OutputStreamWriter 采用您可以省略的可选编码。

      【讨论】:

        猜你喜欢
        • 2016-07-29
        • 2010-11-25
        • 1970-01-01
        • 1970-01-01
        • 2011-10-30
        • 2012-11-07
        • 1970-01-01
        • 2016-01-21
        • 1970-01-01
        相关资源
        最近更新 更多