编码自动识别工具 uchardet

2024-04-29 18:18

本文主要是介绍编码自动识别工具 uchardet,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        本文转自网络

        最近在给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的各种移植:

  • python-chardet Python 移植
  • ruby-rchardet Ruby 移植
  • juniversalchardet Java 移植 universalchardet
  • jchardet Java 移植 chardet
  • nuniversalchardet C# 移植 universalchardet
  • nchardet C# 移植 chardet

惟一没有的,竟然是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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/946807

相关文章

揭秘未来艺术:AI绘画工具全面介绍

📑前言 随着科技的飞速发展,人工智能(AI)已经逐渐渗透到我们生活的方方面面。在艺术创作领域,AI技术同样展现出了其独特的魅力。今天,我们就来一起探索这个神秘而引人入胜的领域,深入了解AI绘画工具的奥秘及其为艺术创作带来的革命性变革。 一、AI绘画工具的崛起 1.1 颠覆传统绘画模式 在过去,绘画是艺术家们通过手中的画笔,蘸取颜料,在画布上自由挥洒的创造性过程。然而,随着AI绘画工

墨刀原型工具-小白入门篇

墨刀原型工具-小白入门篇 简介 随着互联网的发展和用户体验的重要性越来越受到重视,原型设计逐渐成为了产品设计中的重要环节。墨刀作为一款原型设计工具,以其简洁、易用的特点,受到了很多设计师的喜爱。本文将介绍墨刀原型工具的基本使用方法,以帮助小白快速上手。 第一章:认识墨刀原型工具 1.1 什么是墨刀原型工具 墨刀是一款基于Web的原型设计工具,可以帮助设计师快速创建交互原型,并且可以与团队

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

Windows/macOS/Linux 安装 Redis 和 Redis Desktop Manager 可视化工具

本文所有安装都在macOS High Sierra 10.13.4进行,Windows安装相对容易些,Linux安装与macOS类似,文中会做区分讲解 1. Redis安装 1.下载Redis https://redis.io/download 把下载的源码更名为redis-4.0.9-source,我喜欢跟maven、Tomcat放在一起,就放到/Users/zhan/Documents

OpenCompass:大模型测评工具

大模型相关目录 大模型,包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步,扬帆起航。 大模型应用向开发路径:AI代理工作流大模型应用开发实用开源项目汇总大模型问答项目问答性能评估方法大模型数据侧总结大模型token等基本概念及参数和内存的关系大模型应用开发-华为大模型生态规划从零开始的LLaMA-Factor

简鹿文件批量重命名:一款文件批量改名高手都在用的工具

作为 IT 行业的搬砖民工,互联网的数据量爆炸性增长,文件管理成为了一项日益重要的任务。"简鹿文件批量重命名"应运而生,旨在为用户提供一个高效、灵活的解决方案,以应对繁琐的文件命名、排序、创建及属性修改等挑战。 这款软件凭借其一键式操作、强大的自定义规则导入、以及全面的批量处理能力,极大地简化了文件管理流程,尤其适合处理大量文件的个人用户及企业环境,是提高工作效率、保持文件系统整洁的得力助手

如何用外呼工具和CRM管理系统形成销售闭环

使用外呼工具和CRM管理系统形成销售闭环是一个系统性的过程,它涉及客户数据的整合、个性化的营销活动、销售与市场活动的协作、顾客行为的追踪与理解以及营销成效的评估与优化等多个环节。 以下是如何将外呼工具和CRM管理系统有效结合以形成销售闭环的步骤: 1. 客户数据的整合与分析    - 外呼工具在与客户进行初步沟通时,会收集到客户的基本信息和初步需求。    - 这些信息随后被输入到CRM管

ASP.Net.WebAPI和工具PostMan

1.WebAPI概述 1.1 WebAPI WebAPI 是一种传统的方式,用于构建和暴露 RESTUI风格的Web服务。它提供了丰富的功能和灵活性,可以处理各种HTTP请求,并支持各种数据格式,如JSON、XML等。 WebAPI使用控制器(Controllers)和动作方法(ActionMethods)的概念、通过路由配置将请求映射到相应的方法上。 开发人员可以使用各种属性和过滤器来处

完整的申请邓白氏编码的流程(手把手教你申请邓白氏编码

完整的申请邓白氏编码的流程(手把手教你申请邓白氏编码)  标签: 编码邓白氏编码申请流程苹果开发者账号申请 2016-07-08 16:13  2274人阅读  评论(2)  收藏  举报   分类: 技术  苹果开发  邓白氏编码申请 版权声明:本文为博主原创文章,未经博主允许不得转载。     申请公司的苹果开发者账号和企业级的苹

使用XmlPullParser制作BindView工具

在之前我写过了一个BindView的工具,之前使用的最要是正则表达的文本分析做的。最近,工作我认识了Android的XML解析,我又想起了这个问题。发现这个问题,其实用XmlPullParser更好解决。所以我重新写了这个工具。简单多了,而且不用格式化代码。 先分析一下如何写,简易思路如下 Created with Raphaël 2.1.0 输入文本路径 读取x