【问题标题】:utf-8 encoded text arrives with extra characters, howcome?utf-8 编码的文本带有额外的字符,怎么回事?
【发布时间】:2011-02-07 23:34:54
【问题描述】:

数据通过带有 utf-8 编码数据的 XML 进入我的应用程序。用户输入的文本保存在 XML 中,然后我的应用程序会读取它。

最近当用户在末尾写了一个特殊字符时它失败了。结果是在 XML 中,每个字符前面都有一个额外的 0x40 字符。所以不是接收:

67 6f 20 61 68 65 61 64 (go ahead)

收到了:

40 67 40 6f 40 20 40 61 40 68 40 65 40 61 40 64 (@g@o@ @a@h@e@a@d)

出了什么问题?

二进制中的 0x40 是 01000000,这让我觉得 1 是某种控制位,它采用不同的编码......

【问题讨论】:

  • 你需要提供一个真实的例子——“一个特殊字符”是什么意思?什么程序处理用户输入并生成 XML?您的应用程序是如何读取它的(DOM、流、...)?你是怎么看到有多余的字节的(你用什么程序显示了多余的 0x40 字节)?
  • 好吧,看来我的水晶球又坏了。抱歉,我帮不上忙。
  • 这是一个 XML,payload 应该是用 utf-8 编码的: 用户介绍的 3 个字符是:字母 b + 双卷曲引号 + 字母 b 正如您在 XML 中看到的,两个字母 b 前面都有一个额外的 40。数据是从使用 USSD 的手机引入的,我不知道也无法控制数据如何通过网络传输到生成 de XML 的网关...有人告诉我网络使用 GSM7bit 编码...
  • “406220C64062”的哪一部分是“大弯双引号”? 20C6?是直接来自 GSM7bit 的吗?

标签: xml unicode encoding utf-8 utf-16


【解决方案1】:

如果我理解正确,您是说有效负载是一个假定为 UTF-8 字节的字符串。即

40 62 20 C6 40 62

但这不是有效的 UTF-8。 C6 会破坏它。在 UTF-8 中,只有一个字节 > 0x80 是无效的。如果将上述内容(空格分隔字节)粘贴到我的小转换实用程序中,您可以看到这一点。使用 UFT-8 字节字段)。

http://sodved.awardspace.info/unicode.pl

所以我怀疑您使用的任何工具/库都遇到了无效的 UTF-8 数据,然后正在尝试其他处理方式。 在任何标准编码中,syngle byte 都不是 C6 中的花引号。并且 C6 在 GSM7bit (http://www.developershome.com/sms/gsmAlphabet.asp) 中无效。

所以你真正的问题是它在那里做什么?您确定有效载荷的编码吗?即使在没有 C6 的 GSM7 默认字母表中,它似乎也很奇怪

¡b ¡b

【讨论】:

    【解决方案2】:

    字节 40 62 20 C6 40 62 不是有效的 utf-8!问题是孤立的 startbyte C6。 C6 在双 11000110 中,因此它是 2 字节序列的起始字节(因为它以 110 开头,剩余 5 位是代码点的有效载荷位,即 110)。但是缺少以下起始字节的字节,所以这是一个非法的 2 字节序列!可能字节不是 utf 编码的,C6 是 ANSI 字符 e。 G。单个字符。但是 C6 高于 127,因此不是 ASCII 字符。编码为 utf-8 时,必须使用正确的 utf-8 序列对每个高于 127 的字符进行解码。

    【讨论】:

      猜你喜欢
      • 2013-06-10
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-06
      • 2017-09-04
      • 2011-01-31
      相关资源
      最近更新 更多