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

所以自己使用了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. cocos2dx内存管理机制

    参考以下两篇文章 http://blog.csdn.net/ring0hx/article/details/7946397 http://blog.csdn.net/whuancai/article/ ...

  2. PhpStorm 10.0.3 下载安装与汉化

    https://www.7down.com/soft/229568.html 2JA97R55MG-eyJsaWNlbnNlSWQiOiIySkE5N1I1NU1HIiwibGljZW5zZWVOYW ...

  3. Django Admin定制

    Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有: 依赖APP: django.contrib.auth django.contrib.contenttyp ...

  4. python-web 创建一个输入链接生成的网站

    第一步:写一个自定义程序 #coding=utf-8 import os #Python的标准库中的os模块包含普遍的操作系统功能import re #引入正则表达式对象import urllib # ...

  5. sysbench 参数

    1)插入指定条数的数据 --events=N limit for total number of events [0] --time=N limit for total execution time ...

  6. java之RestTemplate的访问应用

    一.REST即表述性状态传递(英文:Representational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格.它是 ...

  7. to_char 函数将小数点舍掉的解决办法

    to_char(val,'0.9') 9 代表一个数字 0 强制显示0 $ 放置一个$符 L 放置一个浮动本地货币符 . 显示小数点 , 显示千位指示符

  8. django-form.errors和前端上传文件

    一.上传文件: 在相应的模型里面定义`FileField`或者是`ImageField`类型的字段,并且1.设置好`upload_to`参数来指定上传的路径. class User(models.Mo ...

  9. ASP.NET web 应用程序项目

    ASP.NET web  应用程序项目 .ashx .ashx.cs aspx包括前台一些代码要处理,ashx可以看作是没有aspx页面中前台代码的后台.cs文件. 没有了前台代码,服务器负担少一点, ...

  10. Vue 实现微信 jssdk 扫码, 上传图片

    流程 1: 配置微信公众号JS域名 2:前端发送URL后台获取JSSDK配置, 后台Service代码如下, 修改2处位置: WeixinUtil.APPID => 当前公众号APPID Wei ...