开发者

Detect wrong character encodings using python

I'm new to serious programming and I was trying to write a python program where I encountered strings in this form while reading from a file:

Îêåàí Åëüçè - Ìàéæå âåñíà

Ëÿïèñ Òðóáåöêîé - Ñâÿùåííûé Îãîíü

which is actually supposed to be in cyrillic (cp-1251), so this st开发者_高级运维ring is the victim of wrong encoding (I found it after long searching, with the help of this site:Universal Cyrillic Decoder)

Also using detect function in chardet module could find it

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

which gives:

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

after doing the following I'm able to get the intended string

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

which gives:

Океан Ельзи - Майже весна and

Коррозия Металла - Война Миров

respectively for the aforementioned strings.

My question is: Is there anyway to detect such strings? Here are some other strings which I haven't even found a way to correct:

Isao Sasaki - ¨¬¡Æ¨¬¡ÆAI¨¬¡Æ (A Different Farewell) (¡¾¢¬Cy¨ù¡¾ AU¡Æi)

Yoon K. Lee & Salzburg Kammerp - ³»¸¶À½

⁂‭晉䤠圠牥⁥⁡潂⁹䬨牡慭牴湯捩删浥硩䴠楡⥮

��óôåõá üôé ï ã�ìïò �ôáí ìéá áðë� õðüèåóç.

Much grateful for your replies.


Well, that Cyrillic string isn't in cp-1251. As you seem to have found out, it has been encoded "twice". Most likely somebody took a binary string in cp1251 believed it was in utf8 and encoded it in cp1252, or something like that.

No automatic check could figure that out.

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

works. The latter look like UTF8, in that it supports both single and multibyte characters, but it's not UTF8. so again some sort of incorrect transformaton has been done. Going through all possible combinations until one work is probably the only possibility.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜