我的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文档吗?
答案 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)
请注意:
我强烈建议让自己熟悉modern terminology中的微妙之处。
如果这太令人困惑,你可能会看Radix-50,它有一个比Unicode更小的数量级的曲目,但是它仍然表现出几个相同的细微之处,这些细微之处现在已经让人们忽略了Unicode,角色曲目,编码字符集,字符编码形式和字符编码方案。
chars
无法保留字符既然你是从Java那里开始的,那么你脑海中的这些概念并不是明显不同的,这不是你的错。那是因为Java严重混淆了这些问题,没有将编码字符集的抽象代码点(逻辑字符)与一个特定字符编码形式<的
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前言中编写的编码相同。
还要确保从数据库中获取的字符串以正确的方式编码。