转载自: 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作者看到此文请写个官方的教程吧,或者把本文直接链过去:)
分享到:
相关推荐
1. **字符串转换**:通过特定的函数,将字符串中的简体汉字转换为繁体,或者将繁体汉字转换为简体。 2. **文件内容转换**:对文本文件进行读取,然后进行简繁转换,再写回文件,从而完成文件内容的转换。 3. **界面...
微软以技术上难以实现为理由,自己搞了一套扩展字符集,也就是GBK,在GB2312基础上定义了包括繁体字在内的更多汉字,并在WINDOWS简体中文版中加以实施。到了二十世纪末,GBK字符集也不够用了,WINDOWS操作系统将内核...
"简体繁体互换ZHconverter.jar" 是一个专为此目的设计的高效工具包,它具备简洁的界面和强大的功能,能够方便地进行简体中文与繁体中文之间的相互转换。下面我们将详细探讨该工具包的工作原理、使用方法以及其在实际...
在某些情况下,如果你的Linux发行版不直接支持Simsun字体,你可能还需要安装额外的依赖包,如`ttf-wqy-microhei`或`ttf-wqy-zenhei`,这些包提供了对简体和繁体中文的广泛支持。 总之,"Linux中文字体类型包&simsun...
Linux 字符集编码转换是一个非常重要的概念,在 Linux 操作系统中,字符集编码转换是必备的知识。本文将从基础概念开始,逐步引导读者了解字符集编码转换的相关知识。 首先,让我们了解什么是 ASCII 编码。ASCII ...
在Linux操作系统中,为了支持中文显示和打印,我们需要安装并使用合适的中文字体。"simsun.ttc"就是一种常见的中文字体文件,它包含了宋体的字形数据,是Windows系统中的默认中文字体之一。在Linux环境下,我们可以...
简繁转换工具是一种重要的软件应用,它主要用于将简体中文字符转换为繁体中文字符,或者反过来,将繁体中文转换为简体中文。在不同的使用场景中,这种工具非常实用,尤其对于需要处理多种中文编码格式的用户来说,它...
【简繁体转换】是一种常见的文本处理需求,特别是在中文用户群体中,由于历史原因和地域差异,简体中文和繁体中文并存。简体字是简化后的汉字形式,广泛用于中国大陆、新加坡等地,而繁体字则在台湾、香港、澳门以及...
在Windows环境下,C++开发过程中,常常需要处理各种编码格式之间的转换,比如GB2312(简体中文的一种常见编码)与UTF-8(通用的多语言编码)。本项目提供的"ChineseCode.cpp"和"ChineseCode.h"文件,正是为了解决这...
这些服务器虽然在一定程度上满足了中文输入需求,但它们存在一些不足,例如对X IM协议的支持不完整,没有实现简体和繁体中文平台的一体化,且对于复杂的中文输入法可能无法提供全面的功能支持。 针对这些问题,作者...
在Linux系统中,中文乱码问题常常困扰着用户,尤其是当涉及到跨系统数据传输或SSH连接时。这个问题主要源于字符编码的不匹配。在上述内容中,提到了几种不同的字符编码标准,包括GB2312、GBK、BIG5、GB18030以及...
《两岸通--简繁字互转源代码》是一款专门用于简体字与繁体字转换的软件开发资源,它的核心功能在于提供高效准确的汉字字符集转换算法,以实现中文文字在简体与繁体之间的无缝切换。这款源代码对于需要处理简繁体转换...
例如,它可以集成到文本编辑器、文档处理软件、社交媒体分析工具,甚至游戏本地化过程中,帮助处理和转换中文文本内容。同时,由于它是一个独立的jar文件,也方便了开发者进行二次开发和定制,根据特定需求调整转换...
开发人员可以使用Qt的QTextCodec类进行字符编码转换,确保程序能正确显示和处理中文字符。同时,Qtopia提供了QLocale类来处理数字、日期、时间等的本地化格式。 在实际的开发过程中,实现基于嵌入式Linux和Qtopia...
**Tesseract OCR简介** ...通过正确的安装、配置和使用,可以有效地将图像中的汉字转换为可编辑的文本,大大提高工作效率。在实际应用中,根据具体需求进行适当的定制和优化,将使其性能得到更大的提升。
【中文转码器】是一种工具,主要用于处理含有中文字符的文件,确保在不同的操作系统或编码环境中正确显示和处理中文信息。在计算机领域,中文字符的表示方式多种多样,包括GBK、UTF-8、Big5等编码格式。这些编码格式...
易语言是一种专为中国人设计的编程语言,它以简体中文作为编程语法,降低了编程的门槛,使得更多非计算机专业的用户也能进行程序开发。在给定的标题“易语言linux多进程tcp服务器源码”中,我们可以看到这个资源是用...
EZBOOT是一款功能强大的启动引导程序,它支持多种操作系统,如Windows、Linux等,并且提供了简体中文界面,使得国内用户在使用过程中更为便捷。 在描述中提到的内容虽然不太清晰,但可以理解为用户对EZBOOT的肯定...