`
ibadboy
  • 浏览: 84056 次
  • 性别: 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作者看到此文请写个官方的教程吧,或者把本文直接链过去:)
分享到:
评论

相关推荐

    易语言中文简体繁体转换.rar

    1. **字符串转换**:通过特定的函数,将字符串中的简体汉字转换为繁体,或者将繁体汉字转换为简体。 2. **文件内容转换**:对文本文件进行读取,然后进行简繁转换,再写回文件,从而完成文件内容的转换。 3. **界面...

    Linux下Java程序中文乱码问题研究.pdf

    微软以技术上难以实现为理由,自己搞了一套扩展字符集,也就是GBK,在GB2312基础上定义了包括繁体字在内的更多汉字,并在WINDOWS简体中文版中加以实施。到了二十世纪末,GBK字符集也不够用了,WINDOWS操作系统将内核...

    简体繁体互换ZHconverter.jar

    "简体繁体互换ZHconverter.jar" 是一个专为此目的设计的高效工具包,它具备简洁的界面和强大的功能,能够方便地进行简体中文与繁体中文之间的相互转换。下面我们将详细探讨该工具包的工作原理、使用方法以及其在实际...

    Linux中文字体类型包&simsun.7z

    在某些情况下,如果你的Linux发行版不直接支持Simsun字体,你可能还需要安装额外的依赖包,如`ttf-wqy-microhei`或`ttf-wqy-zenhei`,这些包提供了对简体和繁体中文的广泛支持。 总之,"Linux中文字体类型包&simsun...

    Linux字符集编码转换.docx

    Linux 字符集编码转换是一个非常重要的概念,在 Linux 操作系统中,字符集编码转换是必备的知识。本文将从基础概念开始,逐步引导读者了解字符集编码转换的相关知识。 首先,让我们了解什么是 ASCII 编码。ASCII ...

    simsun.ttc linux 中文宋体

    在Linux操作系统中,为了支持中文显示和打印,我们需要安装并使用合适的中文字体。"simsun.ttc"就是一种常见的中文字体文件,它包含了宋体的字形数据,是Windows系统中的默认中文字体之一。在Linux环境下,我们可以...

    简繁转换工具-非常好用

    简繁转换工具是一种重要的软件应用,它主要用于将简体中文字符转换为繁体中文字符,或者反过来,将繁体中文转换为简体中文。在不同的使用场景中,这种工具非常实用,尤其对于需要处理多种中文编码格式的用户来说,它...

    简繁体转换

    【简繁体转换】是一种常见的文本处理需求,特别是在中文用户群体中,由于历史原因和地域差异,简体中文和繁体中文并存。简体字是简化后的汉字形式,广泛用于中国大陆、新加坡等地,而繁体字则在台湾、香港、澳门以及...

    Linux中文输入法服务器的分析和设计.pdf

    这些服务器虽然在一定程度上满足了中文输入需求,但它们存在一些不足,例如对X IM协议的支持不完整,没有实现简体和繁体中文平台的一体化,且对于复杂的中文输入法可能无法提供全面的功能支持。 针对这些问题,作者...

    Linux中文乱码问题.pdf

    在Linux系统中,中文乱码问题常常困扰着用户,尤其是当涉及到跨系统数据传输或SSH连接时。这个问题主要源于字符编码的不匹配。在上述内容中,提到了几种不同的字符编码标准,包括GB2312、GBK、BIG5、GB18030以及...

    Java软件 简繁转换易jar程式嵌入工具

    例如,它可以集成到文本编辑器、文档处理软件、社交媒体分析工具,甚至游戏本地化过程中,帮助处理和转换中文文本内容。同时,由于它是一个独立的jar文件,也方便了开发者进行二次开发和定制,根据特定需求调整转换...

    基于嵌入式Linux和Qtopia平台中文环境的实现.pdf

    开发人员可以使用Qt的QTextCodec类进行字符编码转换,确保程序能正确显示和处理中文字符。同时,Qtopia提供了QLocale类来处理数字、日期、时间等的本地化格式。 在实际的开发过程中,实现基于嵌入式Linux和Qtopia...

    tesseract-ocr安装包和中文语言包

    **Tesseract OCR简介** ...通过正确的安装、配置和使用,可以有效地将图像中的汉字转换为可编辑的文本,大大提高工作效率。在实际应用中,根据具体需求进行适当的定制和优化,将使其性能得到更大的提升。

    中文转码器(文件)

    【中文转码器】是一种工具,主要用于处理含有中文字符的文件,确保在不同的操作系统或编码环境中正确显示和处理中文信息。在计算机领域,中文字符的表示方式多种多样,包括GBK、UTF-8、Big5等编码格式。这些编码格式...

    易语言linux多进程tcp服务器源码

    易语言是一种专为中国人设计的编程语言,它以简体中文作为编程语法,降低了编程的门槛,使得更多非计算机专业的用户也能进行程序开发。在给定的标题“易语言linux多进程tcp服务器源码”中,我们可以看到这个资源是用...

    EZBOOT5.12简体中文

    EZBOOT是一款功能强大的启动引导程序,它支持多种操作系统,如Windows、Linux等,并且提供了简体中文界面,使得国内用户在使用过程中更为便捷。 在描述中提到的内容虽然不太清晰,但可以理解为用户对EZBOOT的肯定...

    minigui如何生成繁体字库以及如何使用繁体.rar

    总的来说,生成和使用Minigui的繁体字库涉及了字体数据的获取、转换、整合以及在应用程序中的加载和使用。通过理解这些步骤,开发者能够为他们的嵌入式系统提供全面的繁体中文支持。在实际操作中,应详细阅读...

    GB2312与UTF-8互转程序,包含源代码,MAKEFILE,及最终库,百分百直接使用

    GB2312和UTF-8是两种常见的字符编码标准,分别在中国大陆的简体中文环境中和全球多语言环境下广泛应用。这个压缩包提供了一个程序,能够实现GB2312和UTF-8之间的转换,这对于处理不同编码格式的数据非常有用。 **GB...

Global site tag (gtag.js) - Google Analytics