chardet在Big5上似乎错误
我正在解码一个很大的(大约一千兆字节)平面文件数据库,这个数据库里的字符编码混得乱七八糟。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 sequence
chardet对它选择的编码信心很高,但它并不能解码……有没有其他合理的方法呢?
1 个回答
有一点非常重要:你不能指望从一段非常短的文本中得到合理的编码猜测,尤其是当这段文本中包含大量普通的ASCII字符时。
关于big5编码:chardet在检查中文编码时范围很广。big5中有很多未使用的编码位置,而chardet并没有把它们排除在外。你发现的那个字符串并不是有效的big5编码。实际上,它是有效的(但没有意义的)big5_hkscs编码(这个编码使用了big5中的很多空位)。
有很多单字节编码可以匹配这个字符串。
在这个阶段,需要寻找其他帮助。搜索“Kuzey”等关键词会找到一部土耳其电视剧《Kuzey rüzgari》,所以我们现在知道这是土耳其语。
这意味着如果这个字符串是由一个懂土耳其语的人输入的,它可能是cp1254、iso_8859_3(或_9)或mac_turkish编码。这些编码在字符串末尾的[Kaz??m]这个词上都会产生乱码。根据imdb网站的信息,这是一个角色的名字,而用cp1254和iso-8859-9解码得到的也是同样的乱码(Kazım)。用你建议的iso-8859-2解码得到KazÄąm,看起来也不太靠谱。
你能把这个总结一下吗?我觉得不太可能 :-)
我强烈建议在这种情况下使用latin1解码(这样就不会搞乱字节),并将记录标记为编码未知。你还应该设定一个最小长度的截止值。
更新 值得一提的是,the_two_bytes_in_the_character_name.decode('utf8') 产生了U+0131这个字符,它是土耳其语和阿塞拜疆语中使用的一个小写字母。进一步搜索表明,Kazım是一个相当常见的土耳其名字。