一、OpenCC介绍

OpenCC (Open Chinese Convert,开放中文转换) 是一个用于中文简繁转换的开源项目,支持词汇级别的转换、异体字转换和地区习惯用词转换(中国大陆、台湾、香港),其官网位于Github中:https://github.com/BYVoid/OpenCC。

OpenCC严格区分「一简对多繁」和「一简对多异」,完全兼容异体字,支持中国大陆、台湾、香港异体字和地区习惯用词转换,词库和函数库完全分离,支持C、C++、Python、PHP、Java、Ruby、Node.js和Android,兼容Windows、Linux、Mac平台。

在Github的Wiki中,有对OpenCC的详细介绍和与cconv的对比,对于现代汉语常用简繁一对多字义、地名等也进行了支持,从介绍上看应该是一个较优秀的解决方案。

二、OpenCC二进制文件的获取

在本站的《使用Visual Studio 2017(VS2017)编译OpenCC 1.0.4 (Open Chinese Convert)源代码》一文中,描述了如何在Windows平台下编译OpenCC 1.0.4。为便于读者使用,所编译出的文件(opencc.dll、opencc.lib)可从CSDN上直接下载;其他操作系统下的编译请参阅其他相关文档。

三、在Java中调用OpenCC进行中文繁体简体转换

3.1 如何从Java中调用DLL

在本站的《在Java中调用DLL动态链接库,基于JNA方案》一文中,描述了如何使用JNA在Java中调用动态链接库的方案,在此不再赘述。在本文最后也给出完整的工程,JNA的使用方式非常简单,没有用过JNA的直接看代码也可以。

3.2 查看opencc.dll导出的API

为了构造JNA的Stub代码,我们必须了解opencc.dll中导出接口的定义,可以通过三种方式进行:

①通过opencc.h头文件(推荐)

opencc.h头文件中定义了所有导出的函数,主要包括:

OPENCC_EXPORT opencc_t opencc_open(const char* configFileName);

OPENCC_EXPORT opencc_t opencc_open_w(const wchar_t* configFileName);

OPENCC_EXPORT int opencc_close(opencc_t opencc);

OPENCC_EXPORT size_t opencc_convert_utf8_to_buffer(opencc_t opencc, const char* input, size_t length, char* output);

OPENCC_EXPORT char* opencc_convert_utf8(opencc_t opencc, const char* input, size_t length);

OPENCC_EXPORT void opencc_convert_utf8_free(char* str);

OPENCC_EXPORT const char* opencc_error(void);

如下图所示:

通过opencc.h头文件查看opencc.dll的导出函数

②使用dumpbin工具

dumpbin工具是VisualStudio自带的工具,不能从CMD中而需要从开发人员命令提示符中运行,使用命令

dumpbin /EXPORTS opencc.dll

即可:

使用dumpbin命令获取dll动态链接库的导出API

③使用Dependency Walker(即原VC6中的denpends.exe)

Dependency Walker早在VC6时代就已经存在,用于查看DLL动态链接库的依赖及导出函数等,但VS2017中已经没有这个工具了,据传其被删除的原因是该工具被Windows SDK组评估为质量不合格。我们可以从http://www.dependencywalker.com上下载Dependency Walker,并利用其分析opencc.dll的导出函数,如下图所示:

使用DependencyWalker查看oepncc.dll的导出函数

3.3 构造JNA的Stub代码

根据JNA的类型映射规范,我们可以构造出如下的Stub类代码(同时请注意图中opencc.dll、配置文件及ocd文件的位置):

使用Java调用OpenCC时的JNA接口代码

对应代码为:

package com.mei.opencc;

import com.sun.jna.Library;

import com.sun.jna.Native;

import com.sun.jna.Pointer;

import com.sun.jna.WString;

public interface Opencc extends Library

{

Opencc INSTANCE = (Opencc) Native.loadLibrary(“opencc”, Opencc.class);

public Pointer opencc_open(String configFileName);

public Pointer opencc_open_w(WString configFileName);

public int opencc_close(Pointer opencc);

public int opencc_convert_utf8_to_buffer(Pointer opencc, String input, int length, String output);

public String opencc_convert_utf8(Pointer opencc, String input, int length);

public void opencc_convert_utf8_free(String input);

public String opencc_error();

}

3.4 编写Java调用opencc.dll的测试代码

以下为Java调用opencc.dll的测试代码。有关opencc的使用请参见相关的官方文档,以下为繁体中文转简体中文,使用默认的t2s配置文件,在此不再赘述:

使用Java调用OpenCC时的测试代码

对应的代码为:

package com.mei.opencc;

import com.mei.opencc.Opencc;

import com.sun.jna.Pointer;

public class OpenccTest

{

public static void main(String[] args)

{

try

{

String configFileName = “E:\\workspace-sts-3.3.0.RELEASE\\OpenccJavaTest\\lib\\t2s.json”;

Pointer opencc = Opencc.INSTANCE.opencc_open(configFileName);

if (Pointer.nativeValue(opencc) == -1)

{

System.err.println(Opencc.INSTANCE.opencc_error());

return;

}

String input = “中文簡繁轉換開源項目,支持詞彙級別的轉換、異體字轉換和地區習慣用詞轉換(中國大陸、臺灣、香港)”;

String output = Opencc.INSTANCE.opencc_convert_utf8(opencc, input, Integer.MAX_VALUE – 1);

if (output == null)

{

System.err.println(Opencc.INSTANCE.opencc_error());

return;

}

System.out.println(output);

Opencc.INSTANCE.opencc_convert_utf8_free(output);

System.out.println(Opencc.INSTANCE.opencc_close(opencc));

}

catch (Exception e)

{

System.err.println(e.toString());

}

}

}

需要注意:

①opencc.dll应该使用32位版本还是64位版本是需要根据JDK或JRE是32位还是64位而决定的,如果使用了不正确的版本会报错“java.lang.UnsatisfiedLinkError: %1 不是有效的 Win32 应用程序”;

②文件编码应设置为UTF-8,否则由于字符串的编码问题,在调用opencc_convert_utf8时会报错“Invalid UTF8”并返回null;

③调用opencc_open时配置文件的路径必须为绝对路径,如果路径中含有中文等需要使用opencc_open_w;

④如果opencc_open调用失败,返回的指针为-1,请注意判断,并使用opencc_error获取出错原因;

⑤调用opencc_open时,可能需要用到*.ocd文件,该文件必须与配置文件放在同一路径下,否则会报错形如“TSPhrases.ocd not found or not accessible.”等;

⑥调用opencc_convert_utf8时,最后一个参数为length字段,文档中明确指出“If length is (size_t)-1, the whole string (terminated by ‘\0’) will be converted.”;

⑦需要调用opencc_convert_utf8_free释放转换后的结果;

我们可以看到,上述繁体中文被成功转换成了中文:

使用Java调用OpenCC时的测试代码输出

3.5 Java调用opencc.dll的完整工程(x64)

Java调用opencc.dll的完整工程(x64)位于GitHub中,请戳此查看,如果有用欢迎Star。

java utf8 简繁转换 类库_在Java中进行中文繁体简体转换,基于OpenCC(Open Chinese Convert)方案...相关推荐

  1. java utf8 简繁转换 类库_JAVA简繁转换(对象)解决办法

    JAVA简繁转换(对象) 目前已实现普通字符串的转换代码如下: static String jtPy = "简体字库"; static String ftPy = "繁體 ...

  2. java utf8 简繁转换 类库,java 中文繁简体转换工具 opencc4j

    创作缘由 对于中文的繁简体转换是一种很常见的需求. 但是很多工具类都是简单的做个映射.(使用map,集合,properties)等. 存在一个严重的问题:特殊词组 的转换可能存在问题. OpenCC ...

  3. java utf8 简繁转换 类库_Java封装简体繁体(香港台湾)转换工具

    简体繁体转换 新建工具类:HKTWwordVO import java.io.BufferedReader; import java.io.FileNotFoundException; import ...

  4. java utf8 简繁转换 类库_java简繁转换(区分港台)

    java工具类,支持中文简体转香港繁体.台湾繁体,繁体转简体: 代码如下: package translate; import java.io.BufferedReader; import java. ...

  5. js网页繁体简体转换

    PHP类UTF8编码内的繁简转换-繁体-简体 注意:非得加上html头 utf-8编码 其它编码无测试 代码实例: <!DOCTYPE html PUBLIC "-//W3C//DTD ...

  6. Word文档中文繁体简体的转换

    GPS平台.网站建设.软件开发.系统运维,找森大网络科技! https://cnsendnet.taobao.com 来自森大科技官方博客 http://www.cnsendblog.com/inde ...

  7. C#对汉语拼音,繁体简体转换的支持

    添加引用: ChineseConverter.dll(对 繁体简体转换的支持 ) ,ChnCharInfo.dll (对拼音的支持).微软发布的补丁! 测试代码如下: ChineseChar cc=n ...

  8. Office 2003英文版 如何增加繁体简体转换的功能?

    从在前前雇主家里工作的时候, 用的就是英文版的Windows XP professional, 英文版的Office 2003 Professional 因为那家雇主的IT个个都是好样的, 没有碰到英 ...

  9. java jre 与jdk的区别_学习java却不知道JRE和JDK的区别?看完这篇文章,让你受益匪浅...

    JRE和JDK的区别? 1.JRE是Java运行时环境 . 它是运行已编译的Java程序所需的所有程序的包,包括Java虚拟机(JVM),Java类库, java命令和其他基础结构. 但是,它不能用于 ...

最新文章

  1. arttemplate 不转义html,使用artTemplate模板引擎渲染错误
  2. echart饼图标签重叠_Echarts 解决饼图文字过长重叠的问题
  3. CString原理介绍
  4. Java 8 Friday:可选将保留为Java中的一个选项
  5. html 实现列表组并排,列表组--自定义列表组
  6. linux下,保存退出vim编辑器(转)
  7. Android 调试技巧之快速重启生效
  8. icesat-2数据下载的几种方法
  9. 解决在Word安装Mendeley失败,提示“错误429:activex部件不能创建对象“问题
  10. Shiro记住我(RememberMe)
  11. Helio X30剩魅族一家客户 联发科恢复元气要一年半
  12. 现代流行的平面设计风格有哪些?——黎乙丙
  13. 网络系统结构与设计的基本原理(二 )
  14. 腾讯滑块JS破解/本地识别DLL
  15. CentOS 7.5系统安装使用Mysql 5.7数据库
  16. Isight软件调用matlab
  17. 零基础从零开始写VO视觉里程计
  18. 宝塔php防盗链,宝塔面板开启防盗链的方法详细教程
  19. 赌徒史玉柱变脸转战IT产业 筹资1亿备战网游
  20. 【笨木头Unity】入门之旅005:正常人都要掌握的操作

热门文章

  1. DEEPNOVA 技术荟系列公开课回顾:释放海量数据价值,尽显数据智能之美
  2. 有着 30 多年经验的程序员最终被辞退了
  3. 精通那么多技术,你为何还是受不到重用?
  4. 全面拥抱云原生应用研发的拐点已经到来
  5. 一文带你弄懂 Java 动态代理 | 原力计划
  6. 离京2小时,快手百亿入云,一切为了「看见」
  7. 从 VMWare 到阿里神龙,虚拟化技术 40 年演进史
  8. 疫情期间天天对你“开枪”的额温枪,你知道它的工作原理吗?| 原力计划
  9. 势头强劲的 Python PK 强大的 C++,究竟谁更胜一筹?
  10. So easy!10 行代码写个“让你惊叹”的文章生成器 | 原力计划