本文转自网络

最近在给OpenCC做图形界面,遇到一个问题:OpenCC默认只能转换utf-8文本,其他编码像GB18030,BIG5只能转换成utf-8以后,才能用OpenCC转换。这个问题说大不大,说小也不小。我完全可以增加一个选项,在打开的时候让用户选择文本编码,然后再转换就行了,但这却给用户非常糟糕的体验,因为很多非专业用户根本不知道什么是文本编码,更别说辨别了。GB18030/BIG5硬要用utf-8打开的话,肯定会遇到乱码。由于Windows默认是GB18030/BIG5编码,一般情况下文本会被保存成默认编码,这样更大大增加了用户遇到乱码的概率。为了提高体验,我计划实现文本编码的自动检测。

最早接触到编码是从做网站开始的,记得如果忘了在head中显式地向浏览器指定编码,就经常会出现乱码,但乱码也并不总是出现,这是怎么回事呢?浏览器还是有自动识别的能力的。发现Firefox浏览器中有一个编码选项,里面有「自动检测」,使用它绝大多数时候都能正确识别。

事实上纯文本的编码检测是一个非常复杂的问题,甚至理论上根本不可能实现。确切地说,「检测」应该叫「探测」或者「推测」才更恰当。自动编码探测的实现原理主要是统计学的方法,每个编码会有一定的特征,首先检测特征是否符合,再使用常用的匹配,类似于蒙特卡罗法。具体方法可以参考Mozilla

mozilla在很多年前就做了一个非常优秀的编码检测工具,叫chardet,后来有发布了算法更加优秀的universalchardet,用于Firefox的自动编码识别。我想,这么出名的一个工具,应该肯定已经有不少人在用了。有意思的是,我在网上找到了chardet和universalchardet的各种移植:

惟一没有的,竟然是C/C++的接口封装。debian更是收录了python-chardet和ruby-rchardet,却没有libchardet或者libuniversalchardet。莫非没有C/C++的应用在使用chardet吗?用强大的Google代码搜索,发现的确有,但几乎都是把chardet的代码内嵌到了项目中,耦合十分紧密。更有直接调用python-chardet的,实现不够纯净。

总觉不该是这样,但经过反复确认,真的没有一个独立的universalchardet的C函数库封装。还是自己动手好了,我从mozilla上面取下来了代码,做了一点点补丁,写了一个接口和命令行界面,取名uchardet,大功告成。测试了一些GB18030和UTF8的文本,感觉准确率非常高,而且速度很快。但是当我试图识别几个字节的短文本的时候,却出现了识别错误,开始以为是我的错,后来发现我用Firefox直接打开,也是无法识别的,而且错误识别的编码一样。看来是上游的问题,应该是算法本身的缺陷吧。想想看,毕竟文本越短歧义的可能性越强。不过既然能达到和Firefox同样的水平,一般应用也就够了。

项目主页在Google code上:

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发布的函数库,这给开发者的限制太大了。

编码自动识别工具 uchardet的更多相关文章

  1. Windows SharePoint Services 3.0编码开发工具和技巧(Part 1 of 2)

    转:http://blog.csdn.net/mattwin/article/details/2074984 WSSv3 Technical Articles_Windows SharePoint S ...

  2. Slickflow.Graph 开源工作流引擎快速入门之四: 图形编码建模工具使用手册

    前言: 业务人员绘制流程时,通常使用图形GUI界面交互操作来完成,然而对于需要频繁操作或者管理较多流程的系统管理用户,就需要一款辅助工具,来帮助他们快速完成流程的创建和编辑更新.Slickflow.G ...

  3. ubuntu下编码转换工具

    ubuntu打开windows下的txt或者代码文件,经常会出现乱码, ubuntu自带一种转换工具,是命令行的,下面提供一种最简单的方法进行转换 比如要转换的文件为1.txt,进入1.txt的目录 ...

  4. 编码识别工具:hash-identifier

    hash-identifier的使用: 当不知道编码是什么类型的时候,可以通过kali系统中的hash工具判别,如下图所示, 在HASH后面输入要判别的编码内容,在后面的Possible Hashs中 ...

  5. native2ascii -- 编码转化工具

    参考文档 http://blog.chinaunix.net/uid-692788-id-2681133.html 功能说明 Java 编译器和其它 Java 工具只能处理含有 Latin-1 和/或 ...

  6. C# 操作Session、Cookie,Url 编码解码工具类WebHelper

    using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Text ...

  7. AllInOneConveter——编码转换工具

    一.Url编码解码 二.Base64编码解码 三.\u形式Unicode和汉互转 四.Md5加密 五.源代码 https://github.com/FrankFan/AllInOneConverter ...

  8. 文件处理-智能检测编码的工具(chardet)

    一.chardet使用方法 问:假如你不知道你要处理的文件是什么编码可怎么办呢? import chardet f = open('通讯录.txt',mode='rb') data = f.read( ...

  9. java读取文件并获得文件编码,转换为指定编码的工具类代码

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.Fi ...

随机推荐

  1. SpringBoot入门Demo(Hello Word Boot)

    Spring Boot 是由Pivotal团队提供的全新框架,其设计目的是用来简化新的Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置. ...

  2. CSS reset--(来自网易)

    /* reset */ html,body,h1,h2,h3,h4,h5,h6,div,dl,dt,dd,ul,ol,li,p,blockquote,pre,hr,figure,table,capti ...

  3. html5 canvas 径向渐变2

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. 20155218 2016-2017-2 《Java程序设计》第7周学习总结

    20155218 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 就目前来说,即使标注为GMT(无论是文件说明,或者是API的日期时间字符串描述),实际上谈到 ...

  5. PHP扩展开发--编写一个helloWorld扩展

    为什么要用C扩展 C是静态编译的,执行效率比PHP代码高很多.同样的运算代码,使用C来开发,性能会比PHP要提升数百倍. 另外C扩展是在进程启动时加载的,PHP代码只能操作Request生命周期的数据 ...

  6. [BZOJ 4350]括号序列再战猪猪侠 题解(区间DP)

    [BZOJ 4350]括号序列再战猪猪侠 Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号 序列S合法,当且仅当: 1.( )是一个 ...

  7. kali更新失败

    今天更新kali时失败,出现如下问题: root@kali:~# apt-get update Get: http://mirrors.aliyun.com/kali kali-rolling InR ...

  8. 云计算--MPI

    [root@localhost mpi]# mpicc -c base.c[root@localhost mpi]# mpicc -o base base.o[root@localhost mpi]# ...

  9. oracle锁表查询,资源占用,连接会话,低效SQL等性能检查

    查询oracle用户名,机器名,锁表对象 select l.session_id sid, s.serial#, l.locked_mode, l.oracle_username, l.os_user ...

  10. centos6.5环境DNS-本地DNS主从服务器bind的搭建

    centos6.5环境DNS-本地DNS主从服务器bind的搭建 在上一篇博客中我已经搭建好了一个本地DNS服务器,能够实现正向反向解析,那么我们只需要加入一台从DNS服务器即可完成,我们来开始配置主 ...