我正在解码一个大型(大约一千兆字节)的平面文件数据库,它无法混合字符编码。到目前为止,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报告对它的编码选择非常有信心,但它没有解码......还有其他合理的方法吗?
答案 0 :(得分:3)
一个不能过分强调的观点:你不应该期望任何合理的编码猜测来自一段文字,这篇文章很短并且其中包含如此高比例的普通旧ASCII字符。
关于big5:在检查CJK编码时,chardet投入了很宽的网络。 big5中有许多未使用的插槽,chardet不排除它们。你发现那个字符串不是big5。它实际上是有效的(但没有意义)big5_hkscs(在big5中使用了很多漏洞)。
有大量符合字符串的单字节编码。
在此阶段,有必要寻求带外帮助。谷歌搜索“Kuzey等”拖拉土耳其电视连续剧“Kuzeyrü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 LATIN SMALL LETTER DOTLESS I,用于土耳其语和阿塞拜疆语。进一步的谷歌搜索表明Kazım是一个普通的土耳其名字。