java utf8 简繁转换 类库_在Java中进行中文繁体简体转换,基于OpenCC(Open Chinese Convert)方案...
一、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)方案...相关推荐
- java utf8 简繁转换 类库_JAVA简繁转换(对象)解决办法
JAVA简繁转换(对象) 目前已实现普通字符串的转换代码如下: static String jtPy = "简体字库"; static String ftPy = "繁體 ...
- java utf8 简繁转换 类库,java 中文繁简体转换工具 opencc4j
创作缘由 对于中文的繁简体转换是一种很常见的需求. 但是很多工具类都是简单的做个映射.(使用map,集合,properties)等. 存在一个严重的问题:特殊词组 的转换可能存在问题. OpenCC ...
- java utf8 简繁转换 类库_Java封装简体繁体(香港台湾)转换工具
简体繁体转换 新建工具类:HKTWwordVO import java.io.BufferedReader; import java.io.FileNotFoundException; import ...
- java utf8 简繁转换 类库_java简繁转换(区分港台)
java工具类,支持中文简体转香港繁体.台湾繁体,繁体转简体: 代码如下: package translate; import java.io.BufferedReader; import java. ...
- js网页繁体简体转换
PHP类UTF8编码内的繁简转换-繁体-简体 注意:非得加上html头 utf-8编码 其它编码无测试 代码实例: <!DOCTYPE html PUBLIC "-//W3C//DTD ...
- Word文档中文繁体简体的转换
GPS平台.网站建设.软件开发.系统运维,找森大网络科技! https://cnsendnet.taobao.com 来自森大科技官方博客 http://www.cnsendblog.com/inde ...
- C#对汉语拼音,繁体简体转换的支持
添加引用: ChineseConverter.dll(对 繁体简体转换的支持 ) ,ChnCharInfo.dll (对拼音的支持).微软发布的补丁! 测试代码如下: ChineseChar cc=n ...
- Office 2003英文版 如何增加繁体简体转换的功能?
从在前前雇主家里工作的时候, 用的就是英文版的Windows XP professional, 英文版的Office 2003 Professional 因为那家雇主的IT个个都是好样的, 没有碰到英 ...
- java jre 与jdk的区别_学习java却不知道JRE和JDK的区别?看完这篇文章,让你受益匪浅...
JRE和JDK的区别? 1.JRE是Java运行时环境 . 它是运行已编译的Java程序所需的所有程序的包,包括Java虚拟机(JVM),Java类库, java命令和其他基础结构. 但是,它不能用于 ...
最新文章
- arttemplate 不转义html,使用artTemplate模板引擎渲染错误
- echart饼图标签重叠_Echarts 解决饼图文字过长重叠的问题
- CString原理介绍
- Java 8 Friday:可选将保留为Java中的一个选项
- html 实现列表组并排,列表组--自定义列表组
- linux下,保存退出vim编辑器(转)
- Android 调试技巧之快速重启生效
- icesat-2数据下载的几种方法
- 解决在Word安装Mendeley失败,提示“错误429:activex部件不能创建对象“问题
- Shiro记住我(RememberMe)
- Helio X30剩魅族一家客户 联发科恢复元气要一年半
- 现代流行的平面设计风格有哪些?——黎乙丙
- 网络系统结构与设计的基本原理(二 )
- 腾讯滑块JS破解/本地识别DLL
- CentOS 7.5系统安装使用Mysql 5.7数据库
- Isight软件调用matlab
- 零基础从零开始写VO视觉里程计
- 宝塔php防盗链,宝塔面板开启防盗链的方法详细教程
- 赌徒史玉柱变脸转战IT产业 筹资1亿备战网游
- 【笨木头Unity】入门之旅005:正常人都要掌握的操作
热门文章
- DEEPNOVA 技术荟系列公开课回顾:释放海量数据价值,尽显数据智能之美
- 有着 30 多年经验的程序员最终被辞退了
- 精通那么多技术,你为何还是受不到重用?
- 全面拥抱云原生应用研发的拐点已经到来
- 一文带你弄懂 Java 动态代理 | 原力计划
- 离京2小时,快手百亿入云,一切为了「看见」
- 从 VMWare 到阿里神龙,虚拟化技术 40 年演进史
- 疫情期间天天对你“开枪”的额温枪,你知道它的工作原理吗?| 原力计划
- 势头强劲的 Python PK 强大的 C++,究竟谁更胜一筹?
- So easy!10 行代码写个“让你惊叹”的文章生成器 | 原力计划