Unicode 字符 Ú 和 É 错误地显示为 š 和 ê

ale*_*n13 2 python unicode utf-8 mojibake

我有一个包含西班牙语文本的 UTF-8 文件,某些带有重音符号的单词在某些软件中显示不正确。

\n\n

我相信我的文件是正确的。例如,名称“JES\xc3\x9aS\”被编码为4A 45 53 C3 9A 53.

\n\n
>>> b\'\\x4A\\x45\\x53\\xC3\\x9A\\x53\'.decode(\'utf-8\')\n\'JES\xc3\x9aS\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

c39a\\u00da根据http://www.fileformat.info/info/unicode/char/00da/index.htm ,是 的正确 UTF-8 编码。

\n\n

那么,为什么有些软件渲染不正确呢?

\n

ale*_*n13 7

这是使用 Latin-1 编码而不是 UTF-8 的结果。两字节 UTF-8 序列被错误地解码为两个字符。

\n\n
>>> \'\xc3\x9a\'.encode(\'utf-8\').decode(\'latin-1\')\n\'\xc3\x83\\x9a\'\n>>> \'\xc3\x89\'.encode(\'utf-8\').decode(\'latin-1\')\n\'\xc3\x83\\x89\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

http://www.fileformat.info/info/unicode/char/9a/index.htm \n http://www.fileformat.info/info/unicode/char/89/index.htm

\n\n

这两个字符都是控制字符,因此它们在不同的软件中可能会显示,也可能不会显示。

\n\n

此外,重复不正确的编码-解码会进一步破坏文本:

\n\n
>> \'\xc3\x9a\'.encode(\'utf-8\').decode(\'latin-1\').encode(\'utf-8\').decode(\'latin-1\')\n\'\xc3\x83\\x83\xc3\x82\\x9a\'\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

更新:如果您看到实际的 \xc5\xa1 和 \xe2\x80\xb0 (而不是不可见的控制字符),则错误的编码是 Windows-1252。

\n\n

Windows-1252是ISO 8859-1的超集,可打印字符为 0x80-0x9f。

\n\n

在 Windows-1252 中,代码点 0x9a 和 0x89 对应于字符\xc5\xa1\xe2\x80\xb0:\n http://www.fileformat.info/info/unicode/char/0161/index.htm \n http://www.fileformat.info/info /unicode/char/2030/index.htm

\n\n
>>> \'\xc3\x9a\'.encode(\'utf-8\').decode(\'Windows-1252\')\n\'\xc3\x83\xc5\xa1\'\n>>> \'\xc3\x89\'.encode(\'utf-8\').decode(\'Windows-1252\')\n\'\xc3\x83\xe2\x80\xb0\'\n
Run Code Online (Sandbox Code Playgroud)\n

  • 它不是 Latin-1,而是 CP1252。 (2认同)