chardet在Big5上似乎错误

2 投票
1 回答
1750 浏览
提问于 2025-04-16 10:13

我正在解码一个很大的(大约一千兆字节)平面文件数据库,这个数据库里的字符编码混得乱七八糟。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 个回答

4

有一点非常重要:你不能指望从一段非常短的文本中得到合理的编码猜测,尤其是当这段文本中包含大量普通的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是一个相当常见的土耳其名字。

撰写回答