编码识别器,自动编码软件

  编码识别器,自动编码软件

  超越虚空的随机代码

  1编码自动识别工具uchardet的设计与开发9评论555意见

  最近在给opencc做图形界面的时候遇到了一个问题:opencc默认只能转换utf-8文本。其他代码像GB18030,BIG5只能转换成utf-8才能用opencc转换。这个问题不大不小。我完全可以添加一个选项,让用户在打开的时候选择文本编码,然后进行转换,但是这样给用户的体验非常不好,因为很多非专业用户根本不知道什么是文本编码,更别说分辨了。如果强行用utf-8打开GB18030/BIG5,肯定会遇到乱码。由于Windows的默认代码是GB18030/BIG5,一般情况下会将文本保存为默认代码,这大大增加了用户遇到乱码的概率。为了改善体验,我打算实现文本编码的自动检测。

  最早接触编码是从做网站开始的。我记得如果忘记在head中给浏览器显式指定编码,经常会出现乱码,但是乱码并不总是出现。这是怎么回事?浏览器仍然具有自动识别的能力。发现火狐浏览器中有一个编码选项,里面有“自动检测”,大部分时间都能正确识别。

  实际上,明文的编码检测是一个非常复杂的问题,甚至理论上是不可能的。确切地说,“检测”应该叫“检测”或“推测”更恰当。代码自动检测的实现原理主要是统计方法。每个代码都有特定的功能。首先检查特征是否一致,然后使用普通匹配,类似蒙特卡罗方法。详见http://www . Mozilla . org/projects/intl/universalcharsetdetection . html。

  Mozilla在很多年前做了一个优秀的代码检测工具叫做chardet,后来又发布了universalchardet,在Firefox中有更好的自动代码识别算法。我想这么有名的工具一定有很多人用过。有趣的是,我在网上找到了chardet和universalchardet的各种移植:

  Python-chardetPython移植ruby-rchardetRuby移植juniversalchardetJava移植universalchardetjchardetJava移植chardetnuniversalchardetC#移植universalchardetnchardetC#移植chardet唯一没有的就是C/C的接口封装,Debian有python-chardet和ruby-rchardet,但是没有libchardet和libuniversalchardet。没有使用chardet的C/C应用吗?用强大的Google代码搜索,发现有,但几乎都是把chardet的代码嵌入到项目中,耦合度非常紧密。有的甚至直接调用python-chardet,实现不够纯粹。

  我觉得没有,但是经过反复确认,真的没有universalchardet的C函数库的独立包。还是自己做比较好。我把mozilla的代码拿下来,稍微修补一下,写了一个界面和命令行界面,命名为uchardet,就完成了。测试了GB18030和UTF8的部分文本,准确率很高,速度很快。然而,当我试图识别几个字节的短文本时,出现了识别错误。一开始,我以为是我的错。后来发现直接用火狐打开,也是无法识别。此外,错误识别的代码是相同的。好像是上游的问题,应该是算法本身的缺陷。想想看,毕竟文字越短,歧义的可能性就越强。不过既然能达到和Firefox一样的水平,一般应用就够了。

  该项目的主页在谷歌代码上:

  http://code.google.com/p/uchardet/

  代码在github上:

  https://github.com/BYVoid/uchardet

  我为什么使用universalchardet?其实代码自动识别的解决方案不止一个,包括icu、IE和API提供的解决方案,还有很多Linux发行版都有过的enca。我用universalchardet,因为它最合适。IE的API不能跨平台,icu实现太大,enca是GPL(注意不是LGPL),用它意味着我要让我所有的源代码都用GPL,而不是更开放的Apache。Universalchardet是MPL,几乎和LGPL一样松散。使用起来没有任何问题。我不太喜欢GPL发布的函数库,对开发者限制太多。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: