【问题标题】:UTF-8 in XML constructed using Java使用 Java 构建的 XML 中的 UTF-8
【发布时间】:2011-08-26 08:21:09
【问题描述】:

我正在使用 Java 构建一些 XML。在 XML 中,某些节点可能具有韩语或其他语言的值。构建后,如何确保我的整个 XML 是 UTF-8 编码?我是否需要使用类似以下的方式将字符串显式更改为 UTF-8:

string = new String(s.getBytes(), "UTF-8");

或者整个字符串会自动变成 UTF-8 吗?

另外,如果我得到一些像 <name>[B@19821f<name> 这样带有一些 UTF-8 的 XML,我怎么知道 [B@19821f 是某个韩语单词的 UTF-8?

【问题讨论】:

  • Kozlov,记得接受你其他问题的一些答案。肯定有人帮助你回答了其中一些问题..

标签: java xml encoding utf-8 character-encoding


【解决方案1】:

字符串包含字符。在将字符串转换为字节之前,编码是无关紧要的。当您调用String.getBytes() 或将字符串写入流(文件、套接字等)时,就会发生这种情况。

确保您使用OutputStreamWriter 来编写您的XML 字符串,并且在构造此OutputStreamWriter 时将UTF-8 指定为字符集。如果您使用像 JAXB 这样的专用编组 API,请设置适当的属性以便使用 UTF-8 编码,并且生成的 XML 包含其编码(在 <?xml ...?> 标头中)。在不知道您使用哪个 API 来生成 XML 字符串的情况下,很难提供更多帮助。

【讨论】:

  • 嗨,非常感谢,我正在使用 ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); PrintWriter pr = new PrintWriter(byteOut);我认为 ByteArrayOutputStream byteOut = new ByteArrayOutputStream();作家作家=空;尝试 { writer = new OutputStreamWriter(byteOut, "UTF-8"); } catch (UnsupportedEncodingException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } PrintWriter pr = new PrintWriter(writer);会解决的。对吗?
【解决方案2】:

首先:您发布的“将字符串更改为 UTF8”的代码是错误的。你从不想使用那个 (*)。

如果您解析 XML(并且 XML 编码正确),那么您已经在 J​​ava 中获得了具有正确解码值的 String 值,因此您无需做任何其他事情,只需处理 @987654322像往常一样@对象。

(*) 在某些情况下,您必须“撤消”已经造成的损坏,而这可能很有用,但这些情况非常罕见,而且通常不会起作用也正确。

【讨论】:

  • 很好的答案!你知道为什么我们经常看到这种不恰当的手动编码/解码吗?是因为对绑定到流或抽象 Unicode 字符的编码器/解码器的概念模糊,还是什么?唯一一次我必须实际执行此操作的是文件错误地包含因行而异的混合编码,或者在处理原始数据库时。你在 Python 中看到错误的手动方法比在 Java 或 Perl 中更常见,但我看到它在所有三个中都出现了,我想知道为什么用户一直在尝试它。
  • 据我所知(我的看法可能是错误的),区别在于在 Python(3 之前,不能谈论 Perl)中,字符串实际上更像是一个字节数组而不是其他任何东西(几乎与 C 中的方式相同):您必须记住对其使用正确的编码等等。然而,在 Java 中,String 的编码是固定不变的。这意味着您可以将其视为“纯 Unicode”(这当然不再正确,因为它现在是 UTF-16):您只需要指定 one 编码,对于转换,另一个是隐式的。
猜你喜欢
  • 2011-02-21
  • 2011-11-28
  • 2019-06-21
  • 1970-01-01
  • 2015-02-15
  • 2013-07-03
  • 2010-10-01
  • 1970-01-01
  • 2012-10-08
相关资源
最近更新 更多