4

我的 Z/OS DB2 数据库中有“N 波浪号”字符 Ñ。我正在从数据中生成一个 xml 文件。在我拥有的 XML 中encoding=UTF-8,但是 Internet Explorer 给了我错误Illegal character in text field。如果我将编码更改为 ISO-8859-1,它就可以正常工作。

我认为 ISO-8859-1 是 UTF-8 的一个子集,那么为什么它不能与 UTF-8 一起使用呢?

UTF-8 是 XML 文档的最佳选择吗?

4

4 回答 4

9

ISO-8859-1不是UTF-8 的子集。它可以表示 UTF-8 中可表示的字符的一个子集,但它的表现方式不同。

ISO-8859-1 和 UTF-8 都是 ASCII 的超集(即它们可以表示 ASCII 可以表示的所有字符并且它们以相同的方式表示它们)。

因此,您不能只将 ISO-8859-1 数据标记为 UTF-8 并希望它有效,您需要将数据实际存储(或转换)为 UTF-8。

于 2011-02-23T15:16:11.013 回答
2

UTF-8 ≠ Unicode

仔细注意:

  • ASCII 是 ISO 8859-1 的子集。
  • ASCII 是 Unicode 的子集。
  • ASCII 是 UTF-8 的子集。
  • ISO 8859-1Unicode 的一个子集。
  • ISO 8859-1不是UTF-8 的子集。
  • Unicode 与 UTF-8 不同。

我强烈建议自己熟悉现代术语的微妙之处。

如果这太令人困惑,您可能会查看Radix-50,它的曲目比 Unicode 小很多数量级,但它仍然表现出一些相同的微妙之处,现在人们在 Unicode、字符曲目、编码字符集、字符编码形式和字符编码方案。

Javachars无法保存字符

由于您是从 Java 开始的,因此在您的脑海中这些不是明确独立的概念真的不是您的错。这是因为 Java 没有将编码字符集的抽象代码点(逻辑字符)与一种特定字符编码形式的低劣机制分开,从而严重混淆了这些问题。

Java 与逻辑字符的悲惨混为一谈chars极其容易出错;也许更准确的说法是 Java 程序员将其混为一谈是悲惨的。无论如何,现在似乎永远没有补救的希望。

如果你必须把这一切都归咎于歇斯底里的海豚,但你能说的最慈善的事情是它非常不幸。正因为如此,像您这样善意且完全称职的程序员将永远容易被混淆,因此将不断地编写简单、清晰和错误的 Java 代码。

关于这一切的教育是唯一可能的缓和措施,但它不是真正的治愈方法。

于 2011-02-23T15:41:25.157 回答
1

ISO-8859-1 根本不是 UTF-8 的子集。ASCII 是 ISO-8859-1UTF-8 的子集。它们在 U+0080 - U+00FF 的 Unicode 码位范围内的字符特别不同。

在 ISO-8859-1 中,字符“Ñ”(U+00D1 拉丁大写字母 N 和波浪号)表示为单字节D1。在 UTF-8 中,相同的字符由两个字节序列表示C3 91

于 2011-02-23T15:20:00.597 回答
0

为了在 Java 中生成 XML,最好的办法是使用 XML 库——这也可以确保一切都是格式正确的。

如果您必须手动创建它,最好使用new OutputStreamWriter(stream, encoding),其中 encoding 与您在 XML 序言中编写的编码相同。

还要确保从数据库中获取的字符串以正确的方式编码。

于 2011-02-23T19:23:29.633 回答