Xml 什么是适当的文本编码?

Xml 什么是适当的文本编码?,xml,encoding,utf-8,character-encoding,Xml,Encoding,Utf 8,Character Encoding,我的客户机和服务器之间的通信是UTF-8中的XML。然而,最近我在数据库中发现了一个非UTF-8字符——整个数据库中只有一个。显然它需要被保存 但是,我不想将客户机和服务器之间的所有消息都更改为UTF-16,因为它们的大小都会突然增加一倍,只需要一个零散的unicode字符 有没有一种更有效的文本编码我可以使用?也许一个仍然将大部分ASCII字符作为8位传输,但仍然允许以某种方式发送非UTF-8字符的系统 不要混淆UTF-8和ASCII。UTF-8是一种Unicode编码。如果您真的支持UTF-

我的客户机和服务器之间的通信是UTF-8中的XML。然而,最近我在数据库中发现了一个非UTF-8字符——整个数据库中只有一个。显然它需要被保存

但是,我不想将客户机和服务器之间的所有消息都更改为UTF-16,因为它们的大小都会突然增加一倍,只需要一个零散的unicode字符


有没有一种更有效的文本编码我可以使用?也许一个仍然将大部分ASCII字符作为8位传输,但仍然允许以某种方式发送非UTF-8字符的系统

不要混淆UTF-8和ASCII。UTF-8是一种Unicode编码。如果您真的支持UTF-8,那么这个Unicode字符不会引起任何问题

如果您错误地说您支持UTF-8,而实际上您只支持ASCII,那么您应该以支持UTF-8为目标

有更有效的方法吗 我可以使用文本编码吗?也许一个 这将传输大多数ASCII码 字符还是8位


这正是utf-8的特点。

utf-8已经支持完整的Unicode目录,并且它可能是用Unicode存储西方语言的最有效编码。您发现的错误不是由于具有不受支持的字符:而是由于具有无效字符,即编码错误


虽然从理论上讲,XML要求不包含错误,但拒绝完整数据几乎不是一种选择,因为可能有供应商不关心数据的有效性。我的建议是记录无效字符,悄悄地丢弃它们,然后警告供应商。

我认为您应该试着理解为什么需要保留此字符

您的数据库的编码是什么?如果它是UTF-8,那么它可能只包含UTF-8字符

您是否将字符的UTF-8二进制表示存储在UTF-8的编码中


您应该坚持使用utf-8,并更彻底地理解您的编码链。

没有非utf-8字符。UTF-8可以对存在的每个字符进行编码,即Unicode中的每个字符。的确,有些八位组序列不是任何字符的UTF-8编码;但这完全不同。我怀疑您收到一条错误消息,说传入的八位字节流无法解码为UTF-8。当发送方将数据编码为iso-8859-1,而接收方希望数据编码为UTF-8时,就会发生这种情况。

抱歉,当我说我在数据库中发现了unicode字符时,我的意思是我发现了非UTF-8字符。我将编辑我的问题。我的观点是UTF-8支持您找到的任何字符。假设您已经确定它没有正确通过,我想说您只需要确保您真正支持UTF-8。忘了UTF-16吧。对不起,我不是文本编码专家,我还是不明白:数据库中一个人的名字有这个字符:ñ,在Java中,当我执行stringToSend.getBytes时,这个字符已损坏。但是如果我使用stringToSend.getBytesCharset.forNameUTF-16,那么我的传输的大小将加倍。您是否尝试使用stringToSend.getBytesCharset.forNameUTF-8?你知道UTF-16不能代表UTF-8不能代表的东西吗?不,老实说,我没有意识到,我认为这是我对两者区别的根本误解。我想我认为UTF-8和Ascii是一回事。这个问题已经教会了我很多。为什么不手动将一个非UTF-8字符更改为UTF-8呢?@Matt Ball最终,该字符仍然需要完整地到达客户端。我当然可以手动将任何非UTF-8字符更改为其他字符以进行手动传输,然后在客户端将其更改回原来的位置,但我想可能有一种编码方式可以满足我的需要。@Matt:UTF-8是Unicode。它将ASCII字符编码为8位,并且支持您在本机上谈论的任何字符。没有非UTF-8字符,因为UTF-8几乎包含人类已知的所有字符。当你说非UTF8字符时,你的确切意思是什么?可能存在格式错误的UTF8流。有关UTF8,请参阅wikipedia页面上的无效字节序列。如果UTF8格式不正确,那么您将无法重新编码到任何其他方案。感谢各位,我认为这是我在这方面缺乏经验的表现:我将返回并重新审视我正在做的事情。抱歉,我应该说,也许一个仍将大部分ASCII字符传输为8位的方案,但仍允许以某种方式发送非UTF-8字符?。我会编辑我的问题,然后它不是你需要的编码,而是一个不在乎你通过它发送什么的交流渠道。请看上面吉米的评论。相信我,我现在明白多了!我错误地认为问题出在我的XML编码器或DB上,但事实上,这是我的通信通道。我想 不是Java的String.getBytes转换为UTF-8,而是-oops!