当前位置: 首页 > news >正文

linux 繁体转简体,Linux下在程序中如何进行繁体中文和简体中文的转换

转载自: http://hi.baidu.com/runningon/item/7acd387eddb5aa346cc37ce4

Linux下在程序中如何进行繁体中文和简体中文的转换

首先发个牢骚吧,简繁转换的问题让我在网上搜了好久都没有好的答案,得到的回答尽是让我建个简繁体字的对照表然后自己查表。我就不信了,这都什么年代了,这么常规的功能还要自己造轮子。果然工夫不负苦心人,轮子终于让我找到了,名叫opencc,ibus-pinyin里的繁体部分使用了它,项目主页地址:

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

不过opencc没有一个简单的教程挺让我抓狂,自己看它的源代码才搞清楚怎么弄,为造福各位和我一样为简繁转换苦恼了很久的童鞋,本人献上这篇文章,欢迎转载,转载请注明作者RunningOn。

在献上教程之前,提醒下面两类童鞋可以不用看本文:

1. 写Windows程序的人。Windows自己提供了LCMapString API可以做简繁转换,搜它就行了,网上例程也多。

2. 用python的人。python下我使用过两个包,一个是jianfan,简单直观,但有bug,有些常用的字都不能转换,推荐度一般。另外一个是opencc的python绑定,主页在http://pypi.python.org/pypi/opencc-python/,网页下方有win和linux的安装包,而且网页里有教程。看不懂英文?我了个擦,那网页里面才几个单词......

本文的重点是Linux下用C语言如何进行简繁转换。以Ubuntu 11.10为例吧,其它发行版应该大同小异。你还需要知道一些文字编码的基础知识。

关于编码的知识这里不打算详细介绍,但你需要知道:中文中常用的编码有gb2312, gbk, gb18030, big5, utf8和unicode。严格来讲gb18030和utf8只是unicode的编码方式,但本文中简单起见把它们认为是不同的编码,想搞清楚编码关系的自己去搜吧,资料很多。

gb2312只含简体字,big5只含繁体字,其它几种编码都同时有简体和繁体字,gb2312可以简单认为是gbk的简体子集。一般来讲简繁转换同时包含了编码的转换,比如香港地区普遍使用big5编码,转为简体字就要先转化为gbk, gb18030, utf8编码中的一种再将繁体转化为简体。

opencc只是一个简繁转换的库,要转换编码我们还需要一个有名的库iconv。这两库的安装方法:

sudo apt-get install libiconv-hook-dev libopencc-dev

libopencc-dev没有提供rpm的包,也没有提供只含库的源码,所以最方便的还是apt-get。

iconv的教程还是有不少的,这里就不做太多介绍了。但注意不是所有编码都能自由转换的,比如如果你是想把big5直接转为gb2312是不行的。

简繁转换的通用思路是先将编码转换为utf8,再在utf8下进行简繁转换,再将utf8转为想要的编码(如果需要)。不多说,直接上代码,该解释的都写到注释里了:

#include

#include

#include

#include

#include

///使用iconv库将字符串从编码from_charset转换到to_charset,输入是inbuf,输出是outbuf

void m_iconv(const char *from_charset, const char * to_charset,

const char *inbuf, size_t inlen, char *outbuf, size_t outlen)

{

memset(outbuf,0,outlen);

iconv_t cd;

cd = iconv_open(to_charset,from_charset);

if (cd==0) return;

iconv(cd, (char **)&inbuf, &inlen, &outbuf, &outlen);

iconv_close(cd);

}

///繁体转化为简体,编码从src_charset转换为dest_charset,输入是src,输出是dest

void cht2chs(const char* src_charset, const char * dest_charset,

const char *src, char *dest)

{

char utf8[1000], tempout[1000], *raw=(char *)src;

m_iconv(src_charset, "utf8", raw, strlen(raw), utf8, sizeof(utf8));    //先转为utf8

opencc_t od = opencc_open(OPENCC_DEFAULT_CONFIG_TRAD_TO_SIMP);

char * chsutf8 = opencc_convert_utf8(od, utf8, strlen(utf8));    //简繁转换

strcpy(tempout, chsutf8);

free(chsutf8);    //一定要free不然会内存泄漏

opencc_close(od);

size_t len = strlen(tempout);

m_iconv("utf8", dest_charset, tempout, len, dest, len*2+1);    //再转到目标编码

}

///简体转化为繁体,编码从src_charset转换为dest_charset,输入是src,输出是dest

void chs2cht(const char* src_charset, const char * dest_charset,

const char *src, char *dest)

{

char utf8[1000], tempout[1000], *raw=(char *)src;

m_iconv(src_charset, "utf8", raw, strlen(raw), utf8, sizeof(utf8));    //先转为utf8

opencc_t od = opencc_open(OPENCC_DEFAULT_CONFIG_SIMP_TO_TRAD);

char * chsutf8 = opencc_convert_utf8(od, utf8, strlen(utf8));    //简繁转换

strcpy(tempout, chsutf8);

free(chsutf8);    //一定要free不然会内存泄漏

opencc_close(od);

size_t len = strlen(tempout);

m_iconv("utf8", dest_charset, tempout, len, dest, len*2+1);    //再转到目标编码

}

int main()    //main里放测试代码

{

char src[] = "\264\372\270\325", dest[100];    //big5编码的繁体的"测试"

cht2chs("big5", "utf8", src, dest);    //根据实际情况,把"utf8"改为你的locale

printf("%s\n", dest);    //输出"测试"

return 0;

}

将以上代码保存到test.c,可以根据实际情况将main函数第二行的utf8改为你的locale。

编译方法:

gcc -o test test.c -lopencc -liconv_hook

运行:

./test

然后就可以看到输出两个简体字"测试"。

把m_iconv, cht2chs和chs2cht这三个函数复制到你的代码里就可以直接使用了。

最后再说明一下,opencc算是所有简繁转换库中做得很不错的了,能处理异体字,还能对一简对多繁和一繁对多简的情况自动处理。之前有一个简繁转换的cconv项目就做得不太好,而且它用GPL协议,对开发者限制太多。而opencc使用Apache开源协议,很宽松。opencc项目很赞,可惜作者在教程上没花什么功夫,所以很长时间都没有在网上看到谁使用它。如果opencc作者看到此文请写个官方的教程吧,或者把本文直接链过去:)

相关文章:

  • unity android 帧数,Unity技术分享(90)|Dalvik Heap内存过高|版本帧率|MeshRenderer
  • signature=fc7ecc5076a2f28da44d79a455e941f3,ECC Signature Generation Device for RFID Tags
  • android 6.0 数据库权限,简单实现安卓系统6.0的权限问题
  • html什么代码确定x坐标,显示X和Y坐标?
  • 网页设计简历中个人作品html,网页设计师简历自我评价填写样本
  • less在html页面中应用,Less 在浏览器中使用
  • Html网页warning,HtmlUnit中屏蔽warnings
  • html乱码框框,zabbix的web界面中文显示方框出现乱码的解决方法
  • html网页文字代码,网页HTML代码:滚动文字的制作
  • win7计算机上缺少网络协议,win7系统安装ipx协议提示找不到相应的模块的解决方法...
  • html显示十进制字符,非法HTML字符:十进制141
  • 计算机网络社团章程,社团日常规章制度
  • 陕西师范大学计算机组成原理试题及答案,陕西师范大学 计算机组成原理(A)07级...
  • 计算机病毒范畴有,计算机病毒是否属于生物的范畴?
  • 计算机培训服务合同,2020年最新版计算机培训合同(合同范本).pdf-汇文网
  • 【刷算法】从上往下打印二叉树
  • 2017年终总结、随想
  • 4. 路由到控制器 - Laravel从零开始教程
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • CentOS7简单部署NFS
  • ECMAScript6(0):ES6简明参考手册
  • ES6之路之模块详解
  • FastReport在线报表设计器工作原理
  • HTML中设置input等文本框为不可操作
  • JAVA SE 6 GC调优笔记
  • Java|序列化异常StreamCorruptedException的解决方法
  • Java深入 - 深入理解Java集合
  • JS专题之继承
  • mysql外键的使用
  • react-native 安卓真机环境搭建
  • SSH 免密登录
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 机器学习中为什么要做归一化normalization
  • 批量截取pdf文件
  • 前端设计模式
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 深度学习中的信息论知识详解
  • 深入浅出webpack学习(1)--核心概念
  • 手写双向链表LinkedList的几个常用功能
  • 为视图添加丝滑的水波纹
  • MyCAT水平分库
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • #{}和${}的区别是什么 -- java面试
  • #HarmonyOS:Web组件的使用
  • $(selector).each()和$.each()的区别
  • (1)(1.13) SiK无线电高级配置(六)
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (pojstep1.1.2)2654(直叙式模拟)
  • (solr系列:一)使用tomcat部署solr服务
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes