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

标签 python character-encoding

我是正式编程的新手,我正在尝试编写一个 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 - ³»¸¶À½
⁂晋传墓碑⁥⁡潂⁹亨炭慭素汤捩剪桩䴡⥮
ÃÃ�óôåõá ìéá ¡

非常感谢您的回复。

最佳答案

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

没有自动检查可以解决的问题。

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

有效。后者看起来像 UTF8,因为它同时支持单字节和多字节字符,但它不是 UTF8。所以又发生了某种不正确的转换。经历所有可能的组合,直到一个作品可能是唯一的可能性。

关于python - 使用python检测错误的字符编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4725274/

相关文章:

python - 如何提高神经网络的准确性

python - 如何使用 jinja2 将模板中的名称复数化?

Android WebView LoadData - 土耳其字符

javascript - 如何在 Node.js 中打开 Windows-1255 编码文件?

Python 将字节拆分为高半字节和低半字节

python - 将项目从列表移动到扑克牌游戏 Python 的另一个列表

python - 谷歌语音识别 API 未监听

c - 如果您知道字符编码,您将如何从 C 语言的文本文件中读取,然后将其显示在控制台上?

c# - Encoding.GetEncoding(437).GetString() 错误?

c++ - 如何从 HTML 页面获取字符集