`
ibadboy
  • 浏览: 82087 次
  • 性别: Icon_minigender_1
  • 来自: 江苏
社区版块
存档分类
最新评论

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 <iconv.h>
#include <opencc/opencc.h>
#include <stdlib.h>
#include <stdio.h>
#include <memory.h>

///使用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作者看到此文请写个官方的教程吧,或者把本文直接链过去:)
分享到:
评论

相关推荐

    经典免费实用看图浏览管理转换工具 XnView 2.49.2 中文完整版.zip

    该软件支持43种语言,并能够在Linux/FreeBSD/Irix/Solaris/HP-UX/AIX等操作系统中使用。 XnView 除了一般的查看、浏览、幻灯显示等功能外,还自带多种滤镜,方便编辑修改;可以批量转换文件格式,创建缩略图并生成...

    Linux防火墙.pdf

    中文名: Linux防火墙 原名: Linux Firewalls: Attack Detection and Response with iptables, psad, and fwsnort 别名: Linux,Firewall,防火墙,iptables,psad,fwsnort 作者: (美)拉什译者: 陈健资源格式: PDF 版本:...

    MySQL 5.1官方简体中文参考手册

    5.12.3. 在多服务器环境中使用客户端程序 5.13. MySQL查询高速缓冲 5.13.1. 查询高速缓冲如何工作 5.13.2. 查询高速缓冲SELECT选项 5.13.3. 查询高速缓冲配置 5.13.4. 查询高速缓冲状态和维护 6. MySQL中的复制 6.1....

    MySQL5.1参考手册官方简体中文版

    5.12.3. 在多服务器环境中使用客户端程序 5.13. MySQL查询高速缓冲 5.13.1. 查询高速缓冲如何工作 5.13.2. 查询高速缓冲SELECT选项 5.13.3. 查询高速缓冲配置 5.13.4. 查询高速缓冲状态和维护 6. MySQL中的复制 6.1....

    TeamSpeak3官方下载 v3.0.11.1 简体中文版.zip

    跨平台100%兼容,同时可以运行在WINDOWS全系列(32位和64位系统)、Linux(32位和64位系统)Mac OS X(苹果)操作系统上。新老用户都将享受到TeamSpeak3无与伦比的强大功能和全新的语音通讯体验。   TS3的新特性...

    PartitionMagic 8.0

    PartitionMagic 8.0简称PQ 8.0 简体中文版的魔法分区大师软件,可让你分割你的硬盘,这样你就可以在你的计算机上组织多个操作系统、程序和数据。它有友善的图形化接口,完全支持鼠标,还有精灵来导引你分割硬盘的...

    开源多平台下载工具 Xtreme Download Manager 7.2.11.zip

    与其他下载管理器和加速器不同,XDM 在下载过程中动态地对下载的文件进行分段,并在不进行附加连接和登录阶段的情况下重用可用的连接,以实现最佳的加速性能。 适用于所有浏览器! XDM 支持所有流行的浏览器,包括 ...

    SOAOFFICE - 微软 OFFICE 中间件

    SOAOFFICE - 微软 OFFICE 中间件 SOAOffice 中间件是北京科翰软件为微软OFFICE量身打造的Web中间件,是Web...SOAOFFICE中间件是一个国际化产品,支持多种界面语言:简体中文、繁体中文、英语、日语、法语、德语等。

    Clipchamp – 转换、压缩、录像-crx插件

    此应用程序很适合MP4的转换 – 例如将老旧的视频转换成现代格式,以便在你的设备中,如智慧手机、平板电脑、膝上电脑、Mac、电脑、Chromebooks或Apple电视上播放视频 Clipchamp也提供为Microsoft办公室软件预设的...

    杰奇1.7完全功能破解版(含注册机及wap)

    繁简双语 - 程序实现了网站内容繁体(big5)和简体(gb312)的相互转换,默认为简体中文。 权限管理 - 细化的权限分类和无限用户等级相结合,用户可以自由设置用户的等级类别,并且针对具体某个权限设置每个等级是否...

    vc++ 应用源码包_1

    主要在MzfHipsDlg中,程序分析进程数据、驱动数据、注册表数据从而实现主动防御。 超级下载 不过不是c++源码 Notepad++ V5.6.8 源码! OA精灵代码 c++版 一套oa系统。 ocxdlgtest dll的一个实例。 OD反汇编引擎...

    OSEICQ即时通讯软件(开源例子)

    1)支持简体中文操作界面,包括客户端和服务端 2)支持英文操作界面,包括客户端和服务端 应用领域: 1. 高稳定性,高负载大用户量在线即时通信环境。 2. 面向高端商务,商贸,音乐娱乐各行业门户网站。 3. P2P 互动...

    freyja-sub-ocr-electron:用于 Freyja 字幕 OCR 提取器的 Nodejs + 电子用户界面

    所有功能都可用,但您在使用该应用程序时可能会遇到错误/崩溃。 请在 github 问题上报告您在log.log文件中遇到的任何错误。系统要求需要 8GB 内存。 强烈建议使用最新的 Nvidia GPU,否则该过程将非常缓慢。用法...

    vc++ 应用源码包_2

    主要在MzfHipsDlg中,程序分析进程数据、驱动数据、注册表数据从而实现主动防御。 超级下载 不过不是c++源码 Notepad++ V5.6.8 源码! OA精灵代码 c++版 一套oa系统。 ocxdlgtest dll的一个实例。 OD反汇编引擎...

    vc++ 应用源码包_6

    主要在MzfHipsDlg中,程序分析进程数据、驱动数据、注册表数据从而实现主动防御。 超级下载 不过不是c++源码 Notepad++ V5.6.8 源码! OA精灵代码 c++版 一套oa系统。 ocxdlgtest dll的一个实例。 OD反汇编引擎...

    vc++ 应用源码包_5

    主要在MzfHipsDlg中,程序分析进程数据、驱动数据、注册表数据从而实现主动防御。 超级下载 不过不是c++源码 Notepad++ V5.6.8 源码! OA精灵代码 c++版 一套oa系统。 ocxdlgtest dll的一个实例。 OD反汇编引擎...

    vc++ 应用源码包_3

    主要在MzfHipsDlg中,程序分析进程数据、驱动数据、注册表数据从而实现主动防御。 超级下载 不过不是c++源码 Notepad++ V5.6.8 源码! OA精灵代码 c++版 一套oa系统。 ocxdlgtest dll的一个实例。 OD反汇编引擎...

    Tinyxml 源代码(VC6 & VS2005)

    对于某些应用程序来说,能够追踪节点和属性在它们源文件中的原始位置是很重要的。另外,知道解析错误在源文件中的发生位置可以节省大量时间。 TinyXML能够追踪所有结点和属性在文本文件中的行列原始位置。...

    若干源程序资料12.rar

    2012-06-11 21:03 956,190 C++ Primer中文版(第4版)中的源代码.rar 2012-06-11 21:12 1,386,523 C++-打飞机的游戏.rar 2012-06-11 21:06 78,719 C++USB接口的鼠标驱动源程序.rar 2012-06-11 21:07 50,067 C++VC编写...

Global site tag (gtag.js) - Google Analytics