使用python检测错误的字符编码

时间:2011-01-18 14:35:59

标签: python character-encoding

我是认真编程的新手,我正在尝试编写一个python程序,我在从文件中读取时遇到了这种形式的字符串:

ÎêåàíÅëüçè - Ìàéæåâåñíà
ËÿïèñÒðóáåöêîé - ÑâÿùåííûéÎãîíü

实际上应该是用西里尔语(cp-1251),所以这个字符串是错误编码的受害者(我经过长时间搜索后找到了它,在这个网站的帮助下:Universal Cyrillic Decoder

在chardet模块中使用detect功能也可以找到它

chardet.detect('Îêåàí Åëüçè - Ìàéæå âåñíà'.decode('utf-8').encode('windows-1252'))

给出:
{'confidence':0.7679697235616183,'encoding':'windows-1251'}

执行以下操作后,我可以获得预期的字符串

string.decode('utf-8').encode('windows-1252').decode('windows-1251').encode('utf-8')

给出:

ОкеанЕльзи - Майжевесна和
КоррозияМеталла - ВойнаМиров

分别为上述字符串。

我的问题是:有没有检测到这样的字符串? 以下是一些我甚至没有找到纠正方法的字符串:

Isao Sasaki - ¨¬¬¬¬¬'AI¨¬¡(不同的告别)(¡¢¬Cy¨'¡AU'i)
Yoon K. Lee& Salzburg Kammerp - ³»¸¶À½
⁂晋䤠圠牥⁥⁡潂⁹䬨牡慭牴汤捩删浥硩䴠楡⥮
à à óÃ'Ã¥ÃμáÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃ¥ ÃáÃÃÃÃÃÃÃÃÃÃÃðÃÃÃ?óç。

非常感谢你的回复。

1 个答案:

答案 0 :(得分:4)

好吧,那个西里尔字符串不在cp-1251中。正如您似乎已经发现的那样,它已被编码为“两次”。很可能有人在cp1251中使用二进制字符串,认为它是在utf8中并在cp1252中编码,或类似的东西。

没有自动检查可以

>>> print 'Îêåàí Åëüçè - Ìàéæå âåñíà'.decode('utf8').encode('latin1').decode('cp1251')
Океан Ельзи - Майже весна

的工作原理。后者看起来像UTF8,因为它支持单字节和多字节字符,但它不是UTF8。所以再次做了一些不正确的变形。经历所有可能的组合,直到一项工作可能是唯一的可能性。