2

我正在解码一个大型(大约千兆字节)平面文件数据库,它随意混合字符编码。到目前为止, 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 报告对它的编码选择非常有信心,但它不解码......还有其他明智的方法吗?

4

1 回答 1

4

不能过分强调的一点:您不应该期望从一段如此短且其中包含如此高比例的普通旧 ASCII 字符的文本中得到任何合理的编码猜测。

关于 big5:chardet 在检查 CJK 编码时撒下了一张非常宽的网。big5 中有很多未使用的插槽,chardet 不排除它们。正如您所发现的,该字符串不是有效的 big5。它实际上是有效的(但没有意义的)big5_hkscs(它使用了 big5 中的很多漏洞)。

有大量适合该字符串的单字节编码。

在这个阶段,有必要寻求带外帮助。谷歌搜索“Kuzey etc”会拖出土耳其电视连续剧“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 LATIN SMALL LETTER DOTLESS I,用于土耳其语和阿塞拜疆语。进一步的谷歌搜索表明 Kazım 是一个足够常见的土耳其名字。

于 2011-01-19T06:13:29.113 回答