将ISO-8859-1与UTF-8进行比较

Rui*_*eco 0 python utf-8 iso-8859-1 mojibake python-2.7

我有一个包含unicode字符串的文件: u"L'\xe9quipe le quotidien"

我有另一个文件,从Windows导出并编码为iso-8859-1相同的字符串:( "L'<E9>quipe le quotidien"这是less我的shell中的复制/粘贴).

转换Windows文件的内容会decode('iso-8859-1').encode('utf8')导致字符串与Windows文件中的字符串不同:L'équipe le quotidien.

这种比较的最佳方法是什么?我似乎无法将latin1字符串转换为utf-8.

Mar*_*ers 5

您的文件未编码为Latin-1(iso-8859-1).你创造了一个Mojibake ; 如果解释为Unicode字符串,我必须编码回Latin-1然后解码为UTF-8:

>>> print u"L'équipe le quotidien.".encode('latin1').decode('utf8')
L'équipe le quotidien.
Run Code Online (Sandbox Code Playgroud)

一般来说,在比较之前,您需要将两个文件解码为unicode对象.即使这样,你仍然会遇到组合变音符号的问题,其中字母é实际上用两个代码点表示,U + 0065 LATIN SMALL LETTER EU + 0301 COMBINING ACUTE ACCENT.

您可以通过规范化文本来解决这个问题; 选择一个分解或组合并将两个字符串规范化为相同的形式; 使用该unicodedata.normalize()功能.有关详细信息,请参阅规范化Unicode.