什么可以解释这种糟糕的字符编码?

sta*_*cke 5 unicode encoding utf-8 character-encoding

什么样的错误编码“堆栈”会为字符串“cin\xc3\xa9ma t\xc3\xa9l\xc3\xa9diffusion”产生以下奇怪的字节?(我省略了空格字符,十六进制:20)

\n\n
cin\xc3\x83%ma\nin HEX: 63 69 6E C3 83 25 6D 61\nmapped: c  i  n  ---\xef\xbf\xbd----  m  a\n\nt\xc3\x83cl\xc3\x83cdiffusion\nin HEX: 74 C3 83 63 6C C3 83 63 64 69 66 66 75 73 69 6F 6E\nmapped: t  ---\xef\xbf\xbd---- l  ---\xef\xbf\xbd---- d  i  f  f  u  s  i  o  n\n
Run Code Online (Sandbox Code Playgroud)\n\n

---\xef\xbf\xbd---- 部分表示不正确的字节。

\n\n

我考虑过“如果转码混乱怎么办?双重编码怎么样?”,但是,看看http://www.fileformat.info/info/unicode/char/00e9/charset_support.htm(以及代码页版本),我注意到没有任何编码可能以十六进制字节 %25 或 %63 结尾 \xc3\xa9 。此时它甚至看起来不像双 UTF8 编码,因为http://en.wikipedia.org/wiki/UTF-8澄清了 %C3 之后的字节需要将第一位设置为10xxxxxx。

\n\n

某些程序如何将重音\xc3\xa9转换为“ \xc3\x83后跟% ”以及“ \xc3\x83后跟c ”?我想追溯错误编码的历史,以便我可以尝试想出一些可以采取措施修复损坏的字符串的方法。

\n\n

也存在这样的可能性:\xc3\xa9本来就不是\xc3\xa9,但我无法理解有人在同一个短语中犯了什么样的拼写错误,以获得两个不同版本的\ xc3\xa9最终被错误编码成两个完全不同的字节集。

\n\n

额外的上下文详细信息:我在 XML 文件中找到了这些损坏的字符串。该文件没有<?xml version="1.0"?>标头,因此假定它是 UTF-8。存在包含具有完美的\xc3\xa9字符的短语的节点,同时存在包含具有损坏的\xc3\xa9字符的短语的节点。

\n\n

据我尝试,iconv -and-family 根本没有做任何事情来帮助解决这种情况。

\n\n

我现在持有的几个后续考虑因素是:我是否应该怀疑 MySQL 及其臭名昭著的懒惰字符集转码?难道是某人在导出 XML 时编写的自定义编码函数写得很糟糕?

\n

Pow*_*tat 1

编码看起来有点奇怪:

\n\n

从 cin\xc3\xa9ma 中获取 \xc3\xa9 结果为 utf-8 编码:

\n\n
\n

\xc3\xa9 = C3 A9

\n
\n\n

你在哪里得到:

\n\n
\n

C3 83 25

\n
\n\n

因此,当它被双重编码时,应该发生以下情况:

\n\n
\n

c3: \xc3\x83 -> c3 83

\n\n

a9: \xc2\xa9 -> c2 a9

\n
\n\n

但这无法解释结果中的 25。

\n\n
\n

25:%

\n
\n\n

那么问题是,如果编码一次,那么像\xc2\xa9这样的未知字符将被替换为%,然后进行第二次编码?

\n