[原创]使用OPENCC库进行简繁转换(C++代码)
最近公司有一款游戏产品,字库存在问题,希望全自动进行简繁同屏自动转换的行为,减少工作量。
所以自己使用了WINDOWS自带的一些转换函数,但发现大量字出现异常,无法转换(测试iconv也发现无法转换)。
顾此记录一些OPENCC的库使用教程,即C++中调用OPENCC库完成字符转换。
注意:OpenCC并非类似iconv的库,他只是一个内码转换库,请勿用于类似iconv场景,请注意区分。
OpenCC的介绍:
Open Chinese Convert (OpenCC, 開放中文轉換) is an opensource project for conversion between Traditional Chinese and Simplified Chinese, supporting character-level conversion, phrase-level conversion, variant conversion and regional idioms among Mainland China, Taiwan and Hong kong.
中文簡繁轉換開源項目,支持詞彙級別的轉換、異體字轉換和地區習慣用詞轉換(中國大陸、臺灣、香港)。
Features 特點
- 嚴格區分「一簡對多繁」和「一簡對多異」。
- 完全兼容異體字,可以實現動態替換。
- 嚴格審校一簡對多繁詞條,原則爲「能分則不合」。
- 支持中國大陸、臺灣、香港異體字和地區習慣用詞轉換,如「裏」「裡」、「鼠標」「滑鼠」。
- 詞庫和函數庫完全分離,可以自由修改、導入、擴展。
- 支持C、C++、Python、PHP、Java、Ruby、Node.js and Android。
- 兼容Windows、Linux、Mac平臺。
通过以上介绍可以发现,OpenCC是一款较为完美的简繁转换字库,此处注意,OpenCC是针对简繁转换的,并不适用于其他国家字符,其他国际语言,请使用iconv。
附OpenCC测评:http://linux-wiki.cn/wiki/zh-hans/%E7%AE%80%E7%B9%81%E8%BD%AC%E6%8D%A2
附在线简繁测试:http://opencc.byvoid.com/
此处针对WINDOWS平台做开发,Linux等请参考官方文档。
1、安装以及编译OpenCC
OpenCC的下载:https://github.com/BYVoid/OpenCC
当前最新版本为: 1.0.4
下载后解压缩,安装CMAKE后在路径执行以下语句:
cmake -H. -Bbuild -G"Visual Studio 12" -DCMAKE_INSTALL_PREFIX="path/to/install"
cmake --build build --config Release --target install
此处注意,VS2013以上版本不兼容XP,请注意更改SLN中的设置。
路径特别注意,写相对路径容易产生出现重复路径无法编译的情况。
此处如果只需要用到开发库 那么只需要执行
cmake -H. -Bbuild -G"Visual Studio 12" -DCMAKE_INSTALL_PREFIX="path/to/install"
然后会生成Build目录,打开下面的SLN即可。
注意OPENCC有用大量的C11特性,在低于2013版本很难编译通过,如果你使用低于2013调用DLL,那么就要注意不要使用网上发布的源码,接下来我会介绍如何转换。
接下来只需要编译OPENCC并将DLL,INCLUDE等文件发布并整合即可,这里就不单独介绍了,非常简单的。
此处1.0.4版本中项目:opencc_phrase_extract 是无法编译的,在GIT上也有对应的issue,删除该项目即可,不影响使用,所以不用管他。
2、在代码中使用OpenCC
当完成以上步骤之后,我们就可以正式在自己的代码中使用openCC进行转换繁体了。
这里特别注意一下,OpenCC只是一个基于utf8格式的简繁转换库,并不存在和iconv相同的转换,所以接下来的代码会使用到大量的boost locale,如果觉得不习惯,可以自己替换成iconv。
介绍一下配置文件的含义(以下内容摘自官方GIT):
Configurations 配置文件
預設配置文件
s2t.jsonSimplified Chinese to Traditional Chinese 簡體到繁體t2s.jsonTraditional Chinese to Simplified Chinese 繁體到簡體s2tw.jsonSimplified Chinese to Traditional Chinese (Taiwan Standard) 簡體到臺灣正體tw2s.jsonTraditional Chinese (Taiwan Standard) to Simplified Chinese 臺灣正體到簡體s2hk.jsonSimplified Chinese to Traditional Chinese (Hong Kong Standard) 簡體到香港繁體(香港小學學習字詞表標準)hk2s.jsonTraditional Chinese (Hong Kong Standard) to Simplified Chinese 香港繁體(香港小學學習字詞表標準)到簡體s2twp.jsonSimplified Chinese to Traditional Chinese (Taiwan Standard) with Taiwanese idiom 簡體到繁體(臺灣正體標準)並轉換爲臺灣常用詞彙tw2sp.jsonTraditional Chinese (Taiwan Standard) to Simplified Chinese with Mainland Chinese idiom 繁體(臺灣正體標準)到簡體並轉換爲中國大陸常用詞彙t2tw.jsonTraditional Chinese (OpenCC Standard) to Taiwan Standard 繁體(OpenCC 標準)到臺灣正體t2hk.jsonTraditional Chinese (OpenCC Standard) to Hong Kong Standard 繁體(OpenCC 標準)到香港繁體(香港小學學習字詞表標準)
一般情况下对于常用的简繁互转,我这里测试后推荐:s2t 或 t2s的配置文件,当涉及到聊天等内容时一般建议使用 s2tw 或 tw2s即可,剩下的未测试,建议自行测试后选择。
配置文件的内容非常简单,对应相应的OCD文件,以s2t.json为例:
{
"name": "Simplified Chinese to Traditional Chinese",
"segmentation": {
"type": "mmseg",
"dict": {
"type": "ocd",
"file": "STPhrases.ocd"
}
},
"conversion_chain": [{
"dict": {
"type": "group",
"dicts": [{
"type": "ocd",
"file": "STPhrases.ocd"
}, {
"type": "ocd",
"file": "STCharacters.ocd"
}]
}
}]
}
看到内容中使用了大量ocd,但是你发现你那边没有ocd是吧,很正常因为ocd需要使用他的工具生成,生成后也不在data\dictionary目录下,而是在build\data目录下,所以找寻的时候要注意,同时如果你实在懒得弄,完全可以使用txt,ocd是为了加速读取,不需要在意它,你如果毫不在意这种速度差异,建议使用txt文件,在data\dictionary目录下查找即可,但是配置文件中的ocd文件均要修改为txt,例如:
{
"name": "Simplified Chinese to Traditional Chinese",
"segmentation": {
"type": "mmseg",
"dict": {
"type": "text",
"file": "STPhrases.txt"
}
},
"conversion_chain": [{
"dict": {
"type": "group",
"dicts": [{
"type": "text",
"file": "STPhrases.txt"
}, {
"type": "text",
"file": "STCharacters.txt"
}]
}
}]
}
配置文件搞完了,我们可以开始编写自己的代码了,这里要注意的是,如果你使用低版本的例如vs2005等版本调用opencc.dll时,你会发现网上的很多教程是错的,因为会产生bad_alloc异常,具体原因还是在于不兼容吧,这里如果是用标准C+调用传参就不会出现异常(如果你有其他更好的办法,请联系我),我的解决办法是,直接调用opencc提供的C函数:
编写一个 GBK转换为BIG5的函数为例:
opencc_t gs2twhwd = NULL;
if (gs2twhwd == NULL)
gs2twhwd = opencc_open("s2t.json"); // step 1 转换为UTF8
std::string szConvsert = lc::to_utf<char>(szGBK,"GBK"); szConvsert = opencc_convert_utf8(gs2twhwd,szConvsert.c_str(),szConvsert.size()); // 转换文本GBK to BIG5
szConvsert = lc::from_utf(szConvsert,"BIG5"); // 转换为本地字符集
大家可以看到,我使用的是标准C函数,这样就不存在低版本VC++兼容高版本VC++的问题。
3、发布OpenCC函数
当完成以上代码编写,接下来要做的就是发布OpenCC的程序,这样就可以完美的跑起来了。
发布非常简单,例如使用s2t.json 以及 t2s.json时,发布配置文件与程序执行文件同级目录,并将ocd或txt文件放到同样目录下即可。
但是这里要注意的是,我们只需要发布我们用得到的文件即可,不需要去发布其他完全未使用的文件增大发布大小。
设置自定义目录的方法:
例如我希望把所有配置文件放到lang目录下,那么加载配置文件的时候要写
gs2twhwd = opencc_open("lang\\s2t.json");
而配置文件中,也要修改为:
{
"name": "Simplified Chinese to Traditional Chinese",
"segmentation": {
"type": "mmseg",
"dict": {
"type": "text",
"file": "lang\\STPhrases.txt"
}
},
"conversion_chain": [{
"dict": {
"type": "group",
"dicts": [{
"type": "text",
"file": "lang\\STPhrases.txt"
}, {
"type": "text",
"file": "lang\\STCharacters.txt"
}]
}
}]
}
以上之后就可以将数据加载到其他位置,当然具体要你自己测试,以上均为相对路径,所以自己程序代码内要管理好对应的目录,否则比较容易出现异常。
[原创]使用OPENCC库进行简繁转换(C++代码)的更多相关文章
- 利用 OpenCC 工具进行文字的简繁转换
前言 近日在公司遇到一个需求,因为准备要推出海外版产品,所以需要将所有的简体文字转换为繁体文字.一开始是改了表面的文字,但是后面发现很多提示语也需要去改,所以找了一个工具去对所有 .m 文件进行批量文 ...
- HanLP极致简繁转换详细讲解
HanLP极致简繁转换详细讲解 作者: hankcs(大快高级研究员 hanlp项目负责人) 谈起简繁转换,许多人以为是小意思,按字转换就行了.事实上,汉语历史悠久,地域复杂,发展至今在字符级别存在“ ...
- Python 轻量化简繁转换
最近项目中用到了简单的简繁转换,如果用OpenCC太重了,于是搜到了 zhconv 这个库. zhconv 提供基于 MediaWiki 词汇表的最大正向匹配简繁转换,Python 2, 3 通用. ...
- SQL简繁转换函数
declare @jall nvarchar(4000),@fall nvarchar(4000) select @jall=N'啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊 ...
- javascript 简繁转换
js 简繁转换 function copy(ob) { var obj=findObj(ob); if (obj) { obj.select();js=obj.createTextRange();js ...
- JavaScript 使用穷举方式实现内容简繁转换
场景: 在Web开发中,有时存在对内容进行简体和繁体互相转换的需求,这时我们可以参考以下做法. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 ...
- js搞定网页的简繁转换
对网页进行简繁字体转换的方法一般有两种:一是使用<简繁通>这样的专业软件,另外一种是制作两套版本的网页.显然,这两种方法都较为麻烦,而且专业软件一般不能用于免费的空间.笔者在这里给大家提供 ...
- js实现简繁转换
document.write(" <a name=\"StranLink\" id=\"StranLink\" style=\"col ...
- Elasticsearch高级搜索排序( 中文+拼音+首字母+简繁转换+特殊符号过滤)
一.先摆需求: 1.中文搜索.英文搜索.中英混搜 如:"南京东路","cafe 南京东路店" 2.全拼搜索.首字母搜索.中文+全拼.中文+首字母混搜 如 ...
随机推荐
- Documentation/filesystems/sysfs.txt 文档翻译--sysfs
sysfs - 用于导出内核对象的文件系统. 1.sysfs是一个基于ram的文件系统,最初基于ramfs. 它提供了一种方法,可以将内核数据结构,它们的属性以及它们之间的链接导出到用户空间.sysf ...
- spark on es 多索引查询
核心接口 trait SparkOnEsService { val conf = new SparkConf // conf.setMaster("local[10]") val ...
- 简单桶排序算法-python实现
#-*- coding: UTF-8 -*- import numpy as np def BucketSort(a, n): barrel = np.zeros((1, n), dtype = 'i ...
- 02 - Unit011:Spring AOP
Spring AOP 面向切面(儿)编程(横切编程) Spring 核心功能之一 Spring 利用AspectJ 实现. 底层是利用 反射的动态代理机制实现的 其好处: 在不改变原有功能情况下, 为 ...
- bzoj 3059: 归途与征程
Description 给出一个长度为N的由小写字母’a’~’z’和’*’组成的字符串A,一个长度为M的仅由小写字母’a’~’z’组成的字符串B.一个’*’可以匹配任意多个字符(包括0个).求在B的所 ...
- icape3 的使用
在FPGA中,有时需要使用用户代码重配置FPGA,配置的内容可以是flash或者是其他的来源这样FPGA的启动模式有关,在本实验中配置文件是存放在flash中.实际的操作步骤如下: 1:生成一个工程, ...
- http中的Content-Type
要学习content-type,必须事先知道它到底是什么,是干什么用的. HTTP协议(RFC2616)采用了请求/响应模型.客户端向服务器发送一个请求,请求头包含请求的方法.URI.协议版本.以及包 ...
- JavaScript Promise的学习笔记
首先声明:本人今天刚接触Promise,通过一个例子,希望能更好的来理解,如果有不对的地方,还望指正 Promise是专门为解决 js中回调而引起的各种问题,而产生的. 在异步编程中,我们经常使用回调 ...
- 使用docker快速搭建环境-安装mysql
install docker sudo apt-get install -y docker.io download mysql sudo docker pull mysql start mysql s ...
- 一些linux知识和http知识
1 yum安装比源码编译安装 有的模块不能自定义安装 只能安装默认的模块进行安装 2 关于php的fastcgi 如果使用fastcgi 那么需要启动服务 如果不使用fastcgi 那么不需要启 ...