最近公司有一款游戏产品,字库存在问题,希望全自动进行简繁同屏自动转换的行为,减少工作量。

所以自己使用了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.json Simplified Chinese to Traditional Chinese 簡體到繁體
  • t2s.json Traditional Chinese to Simplified Chinese 繁體到簡體
  • s2tw.json Simplified Chinese to Traditional Chinese (Taiwan Standard) 簡體到臺灣正體
  • tw2s.json Traditional Chinese (Taiwan Standard) to Simplified Chinese 臺灣正體到簡體
  • s2hk.json Simplified Chinese to Traditional Chinese (Hong Kong Standard) 簡體到香港繁體(香港小學學習字詞表標準)
  • hk2s.json Traditional Chinese (Hong Kong Standard) to Simplified Chinese 香港繁體(香港小學學習字詞表標準)到簡體
  • s2twp.json Simplified Chinese to Traditional Chinese (Taiwan Standard) with Taiwanese idiom 簡體到繁體(臺灣正體標準)並轉換爲臺灣常用詞彙
  • tw2sp.json Traditional Chinese (Taiwan Standard) to Simplified Chinese with Mainland Chinese idiom 繁體(臺灣正體標準)到簡體並轉換爲中國大陸常用詞彙
  • t2tw.json Traditional Chinese (OpenCC Standard) to Taiwan Standard 繁體(OpenCC 標準)到臺灣正體
  • t2hk.json Traditional 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++代码)的更多相关文章

  1. 利用 OpenCC 工具进行文字的简繁转换

    前言 近日在公司遇到一个需求,因为准备要推出海外版产品,所以需要将所有的简体文字转换为繁体文字.一开始是改了表面的文字,但是后面发现很多提示语也需要去改,所以找了一个工具去对所有 .m 文件进行批量文 ...

  2. HanLP极致简繁转换详细讲解

    HanLP极致简繁转换详细讲解 作者: hankcs(大快高级研究员 hanlp项目负责人) 谈起简繁转换,许多人以为是小意思,按字转换就行了.事实上,汉语历史悠久,地域复杂,发展至今在字符级别存在“ ...

  3. Python 轻量化简繁转换

    最近项目中用到了简单的简繁转换,如果用OpenCC太重了,于是搜到了 zhconv 这个库. zhconv 提供基于 MediaWiki 词汇表的最大正向匹配简繁转换,Python 2, 3 通用. ...

  4. SQL简繁转换函数

    declare @jall nvarchar(4000),@fall nvarchar(4000) select @jall=N'啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊 ...

  5. javascript 简繁转换

    js 简繁转换 function copy(ob) { var obj=findObj(ob); if (obj) { obj.select();js=obj.createTextRange();js ...

  6. JavaScript 使用穷举方式实现内容简繁转换

    场景: 在Web开发中,有时存在对内容进行简体和繁体互相转换的需求,这时我们可以参考以下做法. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 ...

  7. js搞定网页的简繁转换

    对网页进行简繁字体转换的方法一般有两种:一是使用<简繁通>这样的专业软件,另外一种是制作两套版本的网页.显然,这两种方法都较为麻烦,而且专业软件一般不能用于免费的空间.笔者在这里给大家提供 ...

  8. js实现简繁转换

    document.write(" <a name=\"StranLink\" id=\"StranLink\" style=\"col ...

  9. Elasticsearch高级搜索排序( 中文+拼音+首字母+简繁转换+特殊符号过滤)

    一.先摆需求: 1.中文搜索.英文搜索.中英混搜   如:"南京东路","cafe 南京东路店" 2.全拼搜索.首字母搜索.中文+全拼.中文+首字母混搜   如 ...

随机推荐

  1. bootstrap table教程--后台数据绑定、特殊列处理、排序

    上一篇文章介绍了基本的使用教程.本节主要介绍Bootstrap的后台数据绑定.特殊列处理及列的排序功能 1.数据绑定 一般做程序设计,很少是使用json文件直接绑定数据.基本上我们都是使用编程语言进行 ...

  2. IT项目管理工具总结

    IT项目管理工具总结 俗话说"工欲善其事必先利其器",在一个项目开发流程中,如果搭配一个比较完善的项目管理工具,必将取得事半功倍的效果.本文搜集了目前项目管理界比较有规模的管理工具 ...

  3. 使用位图文本工具BMFont从图片生成自定义字体

    bmfont工具如何使用 http://www.360doc.com/content/13/1206/12/14253074_334930801.shtml fnt各属性含义 http://www.2 ...

  4. Java多线程编程核心技术,第三章

    1,notify的同步块完了,才会运行wait的同步块 2,interrupt()不是静态方法,用在wait的线程上会有InteruptException,锁也会被释放 3,notify()唤醒的线程 ...

  5. [C++ Primer] 第6章: 函数

    参数传递 const形参和实参: 顶层const作用于对象本身, 和其他初始化过程一样, 当用实参初始化形参时会忽略掉顶层const, 换句话说, 形参顶层const被忽略掉了, 当形参有顶层cons ...

  6. 清理Visual Studio中VC++工程里不需要的文件

    Visual Studio开发C++,工程的空间几M,几十M甚至几百M的长,生成的中间文件看的眼花缭乱,占空间不说,特别是备份拷贝代码时无奈的等待,有了这个脚本,好吧,整个世界清静了. @echo o ...

  7. java.nio.charset.UnsupportedCharsetException: cp0

    使用jython调用python,提示console: Failed to install '': java.nio.charset.UnsupportedCharsetException: cp0. ...

  8. cookies封装

    /** * @author wxf */var cookie=new function(){ this.set=function(name,value,hours){ var life=new Dat ...

  9. sorl 6.6.0 定时更新索引

    solr 定时更新索引 – solr 6.6.0 – dataimport.scheduler 这里先重点说下,定时更新引用的org.apache.solr.handler.dataimport.sc ...

  10. Nginx 系统维护配置

    转自:http://blog.csdn.net/kkgbn/article/details/52153383 tomcat关闭后 请求返回502状态码 error_page /.html; locat ...