我正在解码一个大的(大约1‘m)平面文件数据库,它随意地混合字符编码。到目前为止,python模块chardet在识别编码方面做得很好,但如果遇到障碍...
In [428]: badish[-3]
Out[428]: '\t\t\t"Kuzey r\xfczgari" (2007) {(#1.2)} [Kaz\xc4\xb1m]\n'
In [429]: chardet.detect(badish[-3])
Out[429]: {'confidence': 0.98999999999999999, 'encoding': 'Big5'}
In [430]: unicode(badish[-3], 'Big5')
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (most recent call last)
~/src/imdb/<ipython console> in <module>()
UnicodeDecodeError: 'big5' codec can't decode bytes in position 11-12: illegal multibyte sequencechardet报告说,它对自己选择的编码非常有信心,但它不能解码...有没有其他明智的方法?
发布于 2011-01-19 14:13:29
有一点再强调也不过分:您不应该期望从一段如此短的文本中获得任何合理的编码猜测,并且其中包含如此高比例的普通旧式ASCII字符。
关于big5: chardet在检查CJK编码时撒下了一个非常大的网。在big5中有很多未使用的插槽,chardet并不排除它们。正如您已经发现的,该字符串不是有效的big5。它实际上是有效的(但毫无意义) big5_hkscs (它使用了big5中的许多漏洞)。
有大量适合该字符串的单字节编码。
在这个阶段,有必要寻求带外帮助。在谷歌上搜索"Kuzey等“会出现一部土耳其电视连续剧"Kuzey rüzgari”,所以我们现在有了该语言。
这意味着如果它是由熟悉土耳其语的人输入的,那么它可能是cp1254、iso_8859_3 (或_9)或mac_turkish。所有这些都在接近尾声的时候为Kaz??m这个词制造了一些胡言乱语。根据imdb网站的说法,这是一个字符的名称,它与使用cp1254和iso-8859-9解码得到的胡言乱语相同。使用您建议的iso-8859-2解码得到Kaz?ąm,这看起来也不太可信。
你能概括一下吗?我不这么认为:-)
我强烈建议在这种情况下使用latin1进行解码(这样就不会损坏字节),并将记录标记为具有未知编码。你也应该使用最小长度截止值。
the_two_bytes_in_the_character_name.decode('utf8')生产的拉丁文小写字母 U+0131用于土耳其语和阿塞拜疆语。进一步的谷歌搜索表明,Kazım是一个足够常见的土耳其名字。
https://stackoverflow.com/questions/4731684
复制相似问题