我的 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 文档的最佳选择吗?
我的 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 文档的最佳选择吗?
ISO-8859-1不是UTF-8 的子集。它可以表示 UTF-8 中可表示的字符的一个子集,但它的表现方式不同。
ISO-8859-1 和 UTF-8 都是 ASCII 的超集(即它们可以表示 ASCII 可以表示的所有字符并且它们以相同的方式表示它们)。
因此,您不能只将 ISO-8859-1 数据标记为 UTF-8 并希望它有效,您需要将数据实际存储(或转换)为 UTF-8。
仔细注意:
我强烈建议自己熟悉现代术语的微妙之处。
如果这太令人困惑,您可能会查看Radix-50,它的曲目比 Unicode 小很多数量级,但它仍然表现出一些相同的微妙之处,现在人们在 Unicode、字符曲目、编码字符集、字符编码形式和字符编码方案。
chars
无法保存字符由于您是从 Java 开始的,因此在您的脑海中这些不是明确独立的概念真的不是您的错。这是因为 Java 没有将编码字符集的抽象代码点(逻辑字符)与一种特定字符编码形式的低劣机制分开,从而严重混淆了这些问题。
Java 与逻辑字符的悲惨混为一谈chars
极其容易出错;也许更准确的说法是 Java 程序员将其混为一谈是悲惨的。无论如何,现在似乎永远没有补救的希望。
如果你必须把这一切都归咎于歇斯底里的海豚,但你能说的最慈善的事情是它非常不幸。正因为如此,像您这样善意且完全称职的程序员将永远容易被混淆,因此将不断地编写简单、清晰和错误的 Java 代码。
关于这一切的教育是唯一可能的缓和措施,但它不是真正的治愈方法。
ISO-8859-1 根本不是 UTF-8 的子集。ASCII 是 ISO-8859-1和UTF-8 的子集。它们在 U+0080 - U+00FF 的 Unicode 码位范围内的字符特别不同。
在 ISO-8859-1 中,字符“Ñ”(U+00D1 拉丁大写字母 N 和波浪号)表示为单字节D1
。在 UTF-8 中,相同的字符由两个字节序列表示C3 91
。
为了在 Java 中生成 XML,最好的办法是使用 XML 库——这也可以确保一切都是格式正确的。
如果您必须手动创建它,最好使用new OutputStreamWriter(stream, encoding)
,其中 encoding 与您在 XML 序言中编写的编码相同。
还要确保从数据库中获取的字符串以正确的方式编码。