当我声明为UTF-8时,为什么我不能在我的XML输出中使用Ñ?

时间:2011-02-23 15:13:10

标签: java unicode utf-8 character-encoding iso-8859-1

我的Z / OS DB2数据库中有'N Tilde'字符。我正在从数据生成一个xml文件。在我有encoding=UTF-8的XML中,Internet Explorer向我提供了错误Illegal character in text field。如果我将编码更改为ISO-8859-1,它可以正常工作。

我认为ISO-8859-1是UTF-8的子集,那为什么它不适用于UTF-8?

UTF-8最适合XML文档吗?

4 个答案:

答案 0 :(得分:9)

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

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

因此,您不能将ISO-8859-1数据标记为UTF-8并希望它可以正常工作,您需要将数据实际存储(或转换)为UTF-8。

答案 1 :(得分:2)

UTF-8≠Unicode

请注意:

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

我强烈建议让自己熟悉modern terminology中的微妙之处。

如果这太令人困惑,你可能会看Radix-50,它有一个比Unicode更小的数量级的曲目,但是它仍然表现出几个相同的细微之处,这些细微之处现在已经让人们忽略了Unicode,角色曲目,编码字符集,字符编码形式和字符编码方案。

Java chars无法保留字符

既然你是从Java那里开始的,那么你脑海中的这些概念并不是明显不同的,这不是你的错。那是因为Java严重混淆了这些问题,没有将编码字符集的抽象代码点(逻辑字符)与一个特定字符编码形式<的 - 脏机制分开/ strong>即可。

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

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

关于这一切的教育是唯一可行的姑息治疗,但这并不是真正的治愈方法。

答案 2 :(得分:1)

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

在ISO-8859-1中,字符'Ñ'(U + 00D1 LATIN CAPITAL LETTER N WITH TILDE)表示为单字节D1。在UTF-8中,相同的字符由两个字节序列C3 91表示。

答案 3 :(得分:0)

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

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

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