我是认真编程的新手,我正在尝试编写一个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')
给出:
ОкеанЕльзи - Майжевесна和
КоррозияМеталла - ВойнаМиров
分别为上述字符串。
我的问题是:有没有检测到这样的字符串? 以下是一些我甚至没有找到纠正方法的字符串:
非常感谢你的回复。
答案 0 :(得分:4)
好吧,那个西里尔字符串不在cp-1251中。正如您似乎已经发现的那样,它已被编码为“两次”。很可能有人在cp1251中使用二进制字符串,认为它是在utf8中并在cp1252中编码,或类似的东西。
没有自动检查可以 。
>>> print 'Îêåàí Åëüçè - Ìàéæå âåñíà'.decode('utf8').encode('latin1').decode('cp1251')
Океан Ельзи - Майже весна
的工作原理。后者看起来像UTF8,因为它支持单字节和多字节字符,但它不是UTF8。所以再次做了一些不正确的变形。经历所有可能的组合,直到一项工作可能是唯一的可能性。