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

4
我是一名新手程序员,尝试编写一个Python程序,在读取文件时遇到了以下形式的字符串:

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

实际上这应该是使用西里尔字母(cp-1251)编码的文本,因此这个字符串受到了错误编码的影响(我在长时间搜索后找到了它,通过这个网站的帮助:Universal Cyrillic Decoder)。
同时,使用chardet模块中的detect函数也可以发现这个问题。
chardet.detect('Îêåàí Åëüçè - Ìàéæå âåñíà'.decode('utf-8').encode('windows-1252'))

这将会返回:
{'置信度': 0.7679697235616183, '编码方式': '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个回答

4

嗯,那个西里尔字串不是cp-1251编码的。正如你所发现的那样,它被"双重"编码了。很可能有人拿着一个二进制字符串在cp1251中,认为它是utf8编码的,然后再用cp1252或类似的编码方式对其进行了编码。

没有自动检查工具可以找出这个问题。

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

工作。后者看起来像UTF8,因为它支持单字节和多字节字符,但它不是UTF8。所以再次进行了某种不正确的转换。尝试所有可能的组合直到找到一个有效的可能性可能是唯一的选择。


非常感谢,我想我将不得不诉诸于繁琐的试错和一点猜测。好吧,如果我发现更多关于这个问题的信息,我会发布的。 - user579943

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接