quick-chinese-transfer

一灰灰blog约 2932 字大约 10 分钟

中文简繁转换java库

quick-chinese-transfer

Builderopen in new windowMaven Central with version prefix filteropen in new windowJitPackopen in new windowcodecovopen in new windowAverage time to resolve an issueopen in new windowPercentage of issues still openopen in new window

两个插件:

基于这个库实现的 查笔顺 APP,可以在 GooglePlay 上直接下载体验啦

相关教程

简繁转换 (transfer-core)

简体中文,繁体中文,香港繁体,台湾繁体 相互转换的Java库

台湾繁体提供两种转换粒度:

  • ChineseUtils.s2tw(...):简体 → 台湾繁体(台湾字形 + 基础 IT 词汇,对应 OpenCC s2tw.json),如 里 → 裡、软件 → 軟體
  • ChineseUtils.s2twp(...):简体 → 台湾繁体(在 s2tw 基础上叠加完整台湾常用语词典,对应 OpenCC s2twp.json),如 视频 → 影片

本项目主要来自于

词典更新维护来自:

使用姿势

maven依赖

中央仓库导入依赖

<!-- https://mvnrepository.com/artifact/com.github.liuyueyi/quick-transfer-core -->
<dependency>
    <groupId>com.github.liuyueyi</groupId>
    <artifactId>quick-transfer-core</artifactId>
    <version>0.2.18</version>
</dependency>

中央仓库 gradle

// https://mvnrepository.com/artifact/com.github.liuyueyi/quick-transfer-core
implementation 'com.github.liuyueyi:quick-transfer-core:0.2.18'

使用jitpack导入依赖


<repositories>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>

<dependency>
<groupId>com.github.liuyueyi.quick-chinese-transfer</groupId>
<artifactId>quick-transfer-core</artifactId>
<version>0.2.18</version>
</dependency>

gradle依赖

allprojects {
	repositories {
		...
		maven { url 'https://jitpack.io' }
	}
}

dependencies {
    implementation 'com.github.liuyueyi.quick-chinese-transfer:quick-transfer-core:0.2.18'
}

基本使用演示

public void testTrans() {
    String text = "这斜月三星洞…… 长寿面,孙悟空,猪八戒,唐僧,沙和尚,白龙马,李靖,托塔天王, 戏说西游,许多人都这样说,收拾一下,拾金不昧;纔=才";
    String out = ChineseUtils.s2t(text);
    System.out.println("s2t -->" + out);
    String hkOut = ChineseUtils.s2hk(text);
    System.out.println("s2hk -->" + hkOut);
    String twOut = ChineseUtils.s2tw(text);
    System.out.println("s2tw --> " + twOut);

    String origin = ChineseUtils.t2s(out);
    System.out.println("t2s -->" + origin);
    System.out.println("hk2s -->" + ChineseUtils.hk2s(hkOut));
    System.out.println("tw2s -->" + ChineseUtils.tw2s(twOut));
}

输出结果如下

s2t -->這斜月三星洞…… 長壽麪,孫悟空,豬八戒,唐僧,沙和尚,白龍馬,李靖,托塔天王, 戲說西遊,許多人都這樣說,收拾一下,拾金不昧;纔=才
s2hk -->這斜月三星洞…… 長壽麪,孫悟空,豬八戒,唐僧,沙和尚,白龍馬,李靖,托塔天王, 戲説西遊,許多人都這樣説,收拾一下,拾金不昧;才=才
s2tw --> 這斜月三星洞…… 長壽麵,孫悟空,豬八戒,唐僧,沙和尚,白龍馬,李靖,托塔天王, 戲說西遊,許多人都這樣說,收拾一下,拾金不昧;才=才
t2s -->这斜月三星洞…… 长寿面,孙悟空,猪八戒,唐僧,沙和尚,白龙马,李靖,托塔天王, 戏说西游,许多人都这样说,收拾一下,拾金不昧;才=才
hk2s -->这斜月三星洞…… 长寿面,孙悟空,猪八戒,唐僧,沙和尚,白龙马,李靖,托塔天王, 戏说西游,许多人都这样说,收拾一下,拾金不昧;才=才
tw2s -->这斜月三星洞…… 长寿面,孙悟空,猪八戒,唐僧,沙和尚,白龙马,李靖,托塔天王, 戏说西游,许多人都这样说,收拾一下,拾金不昧;才=才

注意:s2tw 与 s2twp 的区别在于地区词典的覆盖规模。s2tw 挂载 t2tw.txt(台湾字形 + 少量 IT 词汇,如 软件→軟體); s2twp 额外挂载 t2twp.txt(源自 OpenCC 的台湾常用语全集),覆盖面更广,如 视频→影片(s2tw 输出 視訊)。

// 台湾字形转换(s2tw)
System.out.println(ChineseUtils.s2tw("视频数据"));   // 視訊資料
// 台湾字形 + 台湾常用语转换(s2twp)
System.out.println(ChineseUtils.s2twp("视频数据"));  // 影片資料

高性能接入

词典预加载

当系统对性能要求较高时,可以考虑提前异步加载词典、避免首次使用加载词典导致开销高

// 预热加载所有的词典
ChineseUtils.preLoad(true,TransType.values());

// 预加载简体转繁体词典
ChineseUtils.preLoad(true,TransType.SIMPLE_TO_TRADITIONAL);

// 预加载简繁互转词典
ChineseUtils.preLoad(true,TransType.SIMPLE_TO_TRADITIONAL, TransType.TRADITIONAL_TO_SIMPLE);

卸载

当内存敏感时,提前卸载无用词典减少内存占用

// 卸载所有词典
ChineseUtils.unLoad(TransType.values());

// 卸载简繁互转词典
ChineseUtils.unLoad(TransType.SIMPLE_TO_TRADITIONAL, TransType.TRADITIONAL_TO_SIMPLE);

转换

ChineseUtils封装了通用的字体转换接口,可以直接通过下面的方式实现转换

ChineseUtils.transfer("一灰灰blog",TransType.SIMPLE_TO_TRADITIONAL);

加载自定义转换词典

若有一些自定义的转换词典,希望加载到转换词典中,可以调用下面的方法进行初始化

在 0.2.16 以及之后的版本中,提供了自定义词典加载功能,使用姿势

Map<String, String> map = new HashMap<>();
map.put("发展国家", "發达國家");
ChineseUtils.loadAdditionalDict(TransType.SIMPLE_TO_TRADITIONAL, map);

加载不参与转换的词典

若自带的转换词典不满足需求,可以使用下面的方式将不参与转换的词加入词典

在 0.2.16 以及之后的版本中,提供了自定义过滤词库加载功能,使用姿势如下

// 简繁转换中,我们不希望将 国 -> 转换为 國, 不希望将 发展国家 转换为 發展國家
ChineseUtils.loadExcludeDict(TransType.SIMPLE_TO_TRADITIONAL, Arrays.asList("发展国家", "国"));

// 验证示例:
System.out.println("加载后:简=>繁 ==>" 
        + ChineseUtils.s2t("中华人民共和国目前还处于发展国家行列,但他依然在快速发展中"));

// 输出内容为: 加载后:简=>繁 ==>中華人民共和国目前還處於发展国家行列,但他依然在快速發展中

上面适用于指定具体的某种转换类型,也可以使用下面的方式将不参与转换的词加入全局的转换中,这样实现不管是什么类型的转换,都维持原状

ChineseUtils.loadExcludeDict(Arrays.asList("发展国家", "国"));

版本说明

汉字笔画 (hanzi-writer)

中文汉字的笔画拆解、动画绘制

数字字典来自

使用姿势

maven依赖

中央仓库导入依赖

<!-- https://mvnrepository.com/artifact/com.github.liuyueyi/hanzi-writer -->
<dependency>
    <groupId>com.github.liuyueyi</groupId>
    <artifactId>hanzi-writer</artifactId>
    <version>0.1.1</version>
</dependency>

中央仓库 gradle

// https://mvnrepository.com/artifact/com.github.liuyueyi/hanzi-writer
implementation 'com.github.liuyueyi:hanzi-writer:0.1.1'

使用jitpack导入依赖


<repositories>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>

<dependency>
<groupId>com.github.liuyueyi.quick-chinese-transfer</groupId>
<artifactId>hanzi-writer</artifactId>
<version>0.1.1</version>
</dependency>

gradle依赖

allprojects {
	repositories {
		...
		maven { url 'https://jitpack.io' }
	}
}

dependencies {
    implementation 'com.github.liuyueyi.quick-chinese-transfer:hanzi-writer:0.1.1'
}

基本使用演示

HanZiRenderResultVo vo = HanZiSvgGenerator
        .newGenerator("帅")
        .setRenderStyle(RenderStyleEnum.TOTAL)
        .setStrokeNumShow(true)
        .setAnimateShow(true)
        .setOutlineShow(true)
        .setWriteTipShow(true)
        .toSvgs();

// svg 表示带动画 + 笔画 的svg格式
String svg = vo.getSvg();
// 逐笔绘制的效果
List<String> strokeSvgList = vo.getStrokes();

几个关键的参数配置

参数类型说明默认值
sizeint输出svg大小300
svgStylestringsvg 根标签的 styleborder: 1px solid rgb(204, 204, 204); background-color: rgb(238, 238, 238);
bgShowboolean是否显示背景的田字格true
bgstring背景信息,田字格<g stroke="lightgray"stroke-dasharray="1,1"stroke-width="1"transform="scale(4, 4)"><line x1="0"y1="0"x2="256"y2="256"></line><line x1="256"y1="0"x2="0"y2="256"></line><line x1="128"y1="0"x2="128"y2="256"></line><line x1="0"y1="128"x2="256"y2="128"></line></g>
outlineShowboolean是否显示背景描边true
outlineColorstring背景描边色rgba(221,221,221,1)
animateShowboolean是否支持按笔画顺序进行动画展示true
drawColorstring动画执行完之后的颜色rgb(85, 85, 85)
midColorstring动画执行过程中的颜色rgb(68, 68, 255)
animateColorstring动画开始执行的颜色rgb(187, 68, 68)
animateSecondsfloat动画时长(秒)0.9
writeTipShowboolean是否显示绘制轮廓的提示true
writeTipStylestring轮廓的提示样式.median-stroke{fill:none;stroke:rgb(15,15,15,0.5);stroke-width:2px;opacity:1}
strokeNumShowboolean是否显示笔画顺序的文字true
strokeNumStylestring笔画提示数字的格式text{font-family:Helvetica;font-size:50px;fill:#ffffff;paint-order:stroke;stroke:#000000;stroke-width:4px;stroke-linecap:butt;stroke-linejoin:miter;font-weight:800}
renderStyleenumNORMAL,STROKE_ANIMATE,TOTALnormal 表示只返回最终的svg, stroke_animate表示只返回笔画拆分结果,total前面两个都返回

对应的svg显示样式如下

帅
帅
12345
帅帅帅帅帅

版本说明

  • 0.1.1
    • 新增 GitHub Action,实现自动上传 jar 包到中央仓库
  • 0.1.0
    • 完成初始版本

中央仓库上传说明

新版中央仓管理地址: central.sonatype.comopen in new window

基于GitHub Action实现自动上传jar包到中央仓库,由于不同模块版本号不一致,因此这里采用分支的触发方式

  1. hanzi: 分支上有变更,表示推送 hanzi-writer 模块到中央仓库
  2. transfer: 分支上有变更,表示推送 transfer-core 模块到中央仓库
  3. release: 分支上有变更,表示整个项目推送到中央仓库

具体实现原理与配置细节,见教程:3. GitHub Action 自动发布 Maven 中央仓库

Loading...