汉字转拼音工具JPinyin的介绍和使用示例

news/2024/7/7 21:31:48

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

汉字转拼音的开源工具类包,已经出现过好几个,比如:Pinyin4J、Jpinyin等。本文主要结合JPinyin汉字转拼音的Java开源类库,给出相关的介绍和使用示例。

Jpinyin介绍

JPinyin是一个汉字转拼音的Java开源类库,在PinYin4j的功能基础上做了一些改进。

JPinyin主要特性

1、准确、完善的字库;

Unicode编码从4E00-9FA5范围及3007(〇)的20903个汉字中,JPinyin能转换除46个异体字(异体字不存在标准拼音)之外的所有汉字;

2、拼音转换速度快;

经测试,转换Unicode编码从4E00-9FA5范围的20902个汉字,JPinyin耗时约100毫秒。

3、多拼音格式输出支持;

JPinyin支持多种拼音输出格式:带音标、不带音标、数字表示音标以及拼音首字母输出格式;

4、常见多音字识别;

JPinyin支持常见多音字的识别,其中包括词组、成语、地名等;

5、简繁体中文转换;

6、支持添加用户自定义字典;

上述主要特性摘自Jpinyin的Github页面

JPinyin原理

JPinyin对汉字转拼音的支持,主要是通过预定的字典文件实现的。Jpinyin预定义了三个字典文件,如下图所示:

其中,pinyin.dict文件定义了汉字和对应拼音的键值对。部分内容如下:

〇=líng
一=yī
丁=dīng,zhēng
丂=kǎo,qiǎo,yú
七=qī
丄=shàng
丅=xià
丆=hǎn
万=wàn,mò
丈=zhàng
三=sān
上=shàng,shǎng
下=xià
丌=qí,jī
不=bù,fǒu
与=yǔ,yù,yú
丏=miǎn
丐=gài
丑=chǒu
丒=chǒu
专=zhuān
且=qiě,jū
丕=pī
世=shì
丗=shì
丘=qiū
丙=bǐng
业=yè

... ...

龆=tiáo
龇=zī
龈=yín,kěn
龉=yǔ
龊=chuò
龋=qǔ
龌=wò
龍=lóng,lǒng
龎=páng
龏=gōng,wò
龐=páng
龑=yǎn
龒=lóng
龓=lóng,lǒng
龔=gōng
龕=kān
龖=dá
龗=líng
龘=dá
龙=lóng
龚=gōng
龛=kān
龜=guī,jūn,qiū
龝=qiū
龞=biē
龟=guī,jūn,qiū
龠=yuè
龡=chuī
龢=hé
龣=jiǎo
龤=xié
龥=yuè

multi_pinyin.dict定义了多音字词语等,部分内容如下:

阿訇=ā,hōng
阿罗汉=ā,luó,hàn
阿木林=ā,mù,lín
阿姨=ā,yí
阿谀=ē,yú
阿附=ē,fù
阿胶=ē,jiāo
阿弥陀佛=ē,mí,tuó,fó
了解=liǎo,jiě
了如指掌=liǎo,rú,zhǐ,zhǎng
一目了然=yī,mù,liǎo,rán
俩人=liǎ,rén
你们俩=nǐ,mēn,liǎ
我们俩=wǒ,mēn,liǎ
他们俩=tā,mēn,liǎ
子弹=zǐ,dàn
炮弹=pào,dàn
弹药=dàn,yào
调查=diào,chá
声调=shēng,diào
音乐=yīn,yuè
乐曲=yuè,qǔ
乐器=yuè,qì
乐谱=yuè,pǔ
缝隙=fèng,xì
胸脯=xiōng,pú

... ...

处方=chǔ,fāng
扒手=pá,shǒu
扒草=pá,cǎo
数据=shù,jù
重新=chóng,xīn
无数=wú,shù
成都=chéng,dū
重来=chóng,lái
重复=chóng,fù
重申=chóng,shēn
重阳=chóng,yáng
重逢=chóng,féng
重沓=chóng,tà
重叠=chóng,dié
重霄=chóng,xiāo
重唱=chóng,chàng
重洋=chóng,yáng
重峦叠嶂=chóng,luán,dié,zhàng
成长=chéng,zhǎng

chinese.dict则定义了繁体字和简体字对应的键值对,用于繁体字和简体字的转换,部分内容如下:

臺=台
萬=万
與=与
醜=丑
專=专
業=业
叢=丛
東=东
絲=丝
丟=丢
兩=两
嚴=严
喪=丧
個=个
爿=丬
豐=丰
臨=临
為=为
麗=丽
舉=举
麼=么
義=义
烏=乌
樂=乐

... ... 

齒=齿
齔=龀
齕=龁
齗=龂
齟=龃
齡=龄
齙=龅
齠=龆
齜=龇
齦=龈
齬=龉
齪=龊
齲=龋
齷=龌
龍=龙
龔=龚
龕=龛
龜=龟

有了上述的字典库,读取相关的字典资源文件,就可以完成繁体字到简体字、汉字到拼音的转换等功能。

Jpinyin主要类介绍

Jpinyin就包含如下图所示的6个Java类:

其中,

  • PinyinHelper.java是汉字转拼音类,其主要有如下几个功能:
  1. 判断一个汉字是否为多音字
  2. 获取字符串对应拼音的首字母
  3. 将字符串转换成带声调格式的拼音
  4. 将字符串转换成相应格式的拼音
  5. 将单个汉字转换为相应格式的拼音
  6. 等等
  • ChineseHelper.java是汉字简繁体转换类,其主要有如下几个功能:
  1. 将单个繁体字转换为简体字
  2. 将单个简体字转换为繁体字
  3. 判断某个字符是否为汉字
  4. 判断字符串中是否包含中文
  5. 等等
  • PinyinFormat.java是拼音格式类,主要提供了三种拼音格式类:
  1. WITH_TONE_MARK 
  2. WITHOUT_TONE
  3. WITH_TONE_NUMBER
package com.github.stuxuhai.jpinyin;

/**
 * 拼音格式类
 *
 * @author stuxuhai (dczxxuhai@gmail.com)
 */
public enum PinyinFormat {
    WITH_TONE_MARK, WITHOUT_TONE, WITH_TONE_NUMBER;
}
  • PinyinResource.java是资源文件加载类,主要提供对预定义的字典文件进行加载。

    protected static Map<String, String> getPinyinResource() {
        return getResource(newClassPathReader("/data/pinyin.dict"));
    }

    protected static Map<String, String> getMutilPinyinResource() {
        return getResource(newClassPathReader("/data/mutil_pinyin.dict"));
    }

    protected static Map<String, String> getChineseResource() {
        return getResource(newClassPathReader("/data/chinese.dict"));
    }

Jpinyin使用示例

汉字简繁体互转

		/**
		 * 简体字和繁体字互转
		 */
		// 义 --> 義
		System.out.println(ChineseHelper.convertToTraditionalChinese('义'));
		// 義 --> 义
		System.out.println(ChineseHelper.convertToSimplifiedChinese('義'));

		// 东无敌 --> 東無敵
		System.out.println(ChineseHelper.convertToTraditionalChinese("东无敌"));
		// 東無敵 --> 东无敌
		System.out.println(ChineseHelper.convertToSimplifiedChinese("東無敵"));

判断是否为中文字符

		/**
		 * 判断是否为中文字符
		 */
		System.out.println(ChineseHelper.isChinese('A')); // false
		System.out.println(ChineseHelper.isChinese('东')); // true
		System.out.println(ChineseHelper.isChinese('東')); // true

判断是否为繁体字

		/**
		 * 是否为繁体字
		 */
		System.out.println(ChineseHelper.isTraditionalChinese('东')); // false
		System.out.println(ChineseHelper.isTraditionalChinese('東')); // true

判断是否包含中文字符

		/**
		 * 判断是否包含中文字符
		 */
		System.out.println(ChineseHelper.containsChinese("ABC")); // false
		System.out.println(ChineseHelper.containsChinese("A东C")); // true
		System.out.println(ChineseHelper.containsChinese("A東C")); // true
	}

汉字简繁转换类的完整示例

import com.github.stuxuhai.jpinyin.ChineseHelper;

/**
 * 
 * @author wangmengjun
 *
 */
public class ChineseHelperExample {

	public static void main(String[] args) {
		/**
		 * 简体字和繁体字互转
		 */
		// 义 --> 義
		System.out.println(ChineseHelper.convertToTraditionalChinese('义'));
		// 義 --> 义
		System.out.println(ChineseHelper.convertToSimplifiedChinese('義'));

		// 东无敌 --> 東無敵
		System.out.println(ChineseHelper.convertToTraditionalChinese("东无敌"));
		// 東無敵 --> 东无敌
		System.out.println(ChineseHelper.convertToSimplifiedChinese("東無敵"));

		/**
		 * 判断是否为中文字符
		 */
		System.out.println(ChineseHelper.isChinese('A')); // false
		System.out.println(ChineseHelper.isChinese('东')); // true
		System.out.println(ChineseHelper.isChinese('東')); // true

		/**
		 * 是否为繁体字
		 */
		System.out.println(ChineseHelper.isTraditionalChinese('东')); // false
		System.out.println(ChineseHelper.isTraditionalChinese('東')); // true

		/**
		 * 判断是否包含中文字符
		 */
		System.out.println(ChineseHelper.containsChinese("ABC")); // false
		System.out.println(ChineseHelper.containsChinese("A东C")); // true
		System.out.println(ChineseHelper.containsChinese("A東C")); // true
	}
}

获取某个中文字符可能的发音

		/**
		 * 获取某个中文字符可能的发音,如 为可以有两种发音[wèi, wéi]
		 */
		String[] weiArray = PinyinHelper.convertToPinyinArray('为');
		// [wèi, wéi]
		System.out.println(Arrays.toString(weiArray));

		/**
		 * 沒有音调
		 */
		String[] weiArrayWithoutTone = PinyinHelper.convertToPinyinArray('为',
				PinyinFormat.WITHOUT_TONE);
		//[wei]
		System.out.println(Arrays.toString(weiArrayWithoutTone));
		
		/**
		 * 有音调,使用数字表示音调
		 */
		String[] weiArrayWithoutToneNum= PinyinHelper.convertToPinyinArray('为',
				PinyinFormat.WITH_TONE_NUMBER);
		//[wei4, wei2]
		System.out.println(Arrays.toString(weiArrayWithoutToneNum));

获取字符串对应拼音的首字母

		/**
		 * 获取字符串对应拼音的首字母
		 */
		try {
			String shortPinyin = PinyinHelper.getShortPinyin("我爱杭州");
			//wahz
			System.out.println(shortPinyin);
		} catch (PinyinException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

将字符串转换成相应格式的拼音

		/**
		 * 将字符串转换成相应格式的拼音
		 */
		try {
			String pinyinString = PinyinHelper.convertToPinyinString("杭州西湖", ",", PinyinFormat.WITH_TONE_MARK);
			//háng,zhōu,xī,hú
			System.out.println(pinyinString);
		} catch (PinyinException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		try {
			String pinyinString = PinyinHelper.convertToPinyinString("杭州西湖", ",", PinyinFormat.WITHOUT_TONE);
			//hang,zhou,xi,hu
			System.out.println(pinyinString);
		} catch (PinyinException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		try {
			String pinyinString = PinyinHelper.convertToPinyinString("杭州西湖", ",", PinyinFormat.WITH_TONE_NUMBER);
			//hang2,zhou1,xi1,hu2
			System.out.println(pinyinString);
		} catch (PinyinException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

汉字转拼音类完整示例

import java.util.Arrays;

import com.github.stuxuhai.jpinyin.PinyinException;
import com.github.stuxuhai.jpinyin.PinyinFormat;
import com.github.stuxuhai.jpinyin.PinyinHelper;


/**
 * @author wangmengjun
 *
 */
public class PinyinHelperExample {

	public static void main(String[] args) {

		/**
		 * 获取某个中文字符可能的发音,如 为可以有两种发音[wèi, wéi]
		 */
		String[] weiArray = PinyinHelper.convertToPinyinArray('为');
		// [wèi, wéi]
		System.out.println(Arrays.toString(weiArray));

		/**
		 * 沒有音调
		 */
		String[] weiArrayWithoutTone = PinyinHelper.convertToPinyinArray('为',
				PinyinFormat.WITHOUT_TONE);
		//[wei]
		System.out.println(Arrays.toString(weiArrayWithoutTone));
		
		/**
		 * 有音调,使用数字表示音调
		 */
		String[] weiArrayWithoutToneNum= PinyinHelper.convertToPinyinArray('为',
				PinyinFormat.WITH_TONE_NUMBER);
		//[wei4, wei2]
		System.out.println(Arrays.toString(weiArrayWithoutToneNum));
		
		/**
		 * 获取字符串对应拼音的首字母
		 */
		try {
			String shortPinyin = PinyinHelper.getShortPinyin("我爱杭州");
			//wahz
			System.out.println(shortPinyin);
		} catch (PinyinException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		/**
		 * 将字符串转换成相应格式的拼音
		 */
		try {
			String pinyinString = PinyinHelper.convertToPinyinString("杭州西湖", ",", PinyinFormat.WITH_TONE_MARK);
			//háng,zhōu,xī,hú
			System.out.println(pinyinString);
		} catch (PinyinException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		try {
			String pinyinString = PinyinHelper.convertToPinyinString("杭州西湖", ",", PinyinFormat.WITHOUT_TONE);
			//hang,zhou,xi,hu
			System.out.println(pinyinString);
		} catch (PinyinException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		try {
			String pinyinString = PinyinHelper.convertToPinyinString("杭州西湖", ",", PinyinFormat.WITH_TONE_NUMBER);
			//hang2,zhou1,xi1,hu2
			System.out.println(pinyinString);
		} catch (PinyinException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

小结

本文对汉字转拼音开源工具Jpinyin进行了简单的介绍,并给出了几个例子。

从使用上来看,Jpinyin的使用还算便利,而且Jpinyin还预留了支持添加用户自定义字典的接口,可以让用户根据自身特点来自定义字典,从而去满足自身业务特点或者功能,如:

         PinyinHelper.addPinyinDict("user.dict");  // 添加用户自定义字典

 

转载于:https://my.oschina.net/wangmengjun/blog/787190


http://www.niftyadmin.cn/n/2822986.html

相关文章

Windows 10 64bit 安装dotnetfx 3.5出错的解决办法(备忘)

从安装镜像找到&#xff1a;microsoft-windows-netfx3-ondemand-package.cab比如&#xff1a;X:\cn_windows_10_enterprise_x64_dvd_6846957\sources\sxs\microsoft-windows-netfx3-ondemand-package.cab以管理员身份运行cmd(winx,命令提示符(管理员));粘贴如下部分并回车(红色…

mysql进程僵死,记录一次MySQL进程崩溃,无法重启故障排查

-07-24 01:58:53 19934 [Note] InnoDB: Initializing buffer pool, size 512.0MInnoDB: mmap(137363456 bytes) failed; errno 122017-07-24 01:58:53 19934 [ERROR] InnoDB: Cannot allocate memory forthe buffer pool2017-07-24 01:58:53 19934 [ERROR] Plugin ‘InnoDB‘ …

Shell编程实践之批量安装JDK

实验环境 只有两台机子&#xff0c;一台虚拟机192.168.1.200&#xff0c;另外一台物理机192.168.1.201。 目标 执行一个shell脚本&#xff0c;给这两台机子自动安装jdk。 实验步骤 1.自动设置ssh免密码登录 执行脚本之后&#xff0c;遍历服务器ip&#xff0c;对每一个服务进行如…

不用写Windows服务实现定时器功能(FluentScheduler )

MacBook Pro 只有四个 USB Type-C 接口是否错了&#xff1f; 一项新技术的诞生总会对已存在的事物造成冲击或影响&#xff0c;如果大家都害怕冲击与影响&#xff0c;那这个世界永远像现在不变就行了&#xff0c;大家都好好的&#xff0c;待在自己的舒适区&#xff0c;社会丝毫…

设备维修管理系统 php,设备维修管理系统V2.0.2

【实例简介】上次上传的版本文件不完整无法安装&#xff0c;现在重新添加上传。【实例截图】【核心代码】设备维修管理系统V2.0修订版└── 设备维修管理系统V2.0修订版├── DATA│ ├── DevWXGL_log.ldf│ ├── DevWXGL.mdf│ └── DevWXGL.sql├── 安装说明…

树莓派centos7.9编译安装cmake .2023-02-18

准备: 以cmake的3.7.2版本为例 切换gcc环境: 树莓派centos7.9(aarch64)安装并切换GCC-7版本. 2023-02-20_mklpo147的博客-CSDN博客 树莓派centos7.9(armv7hl)安装并切换GCC-6版本. 2023-2-18_mklpo147的博客-CSDN博客 yum install -y make 1.下载 wget https://cmake.org/…

NetScaler 官网文档资源导航

NetScaler部署指南&#xff0c;包含微软&#xff0c;思科&#xff0c;Oracle&#xff0c;PaloAlto&#xff0c;AWS等等众多部署指南&#xff0c;不断增加https://www.citrix.com/products/netscaler-adc/resources/deploy.html “怎样做” 指南&#xff0c;各种项目后总结的HOW…

vue-cli 3.x 引入ts下默认配置jssdk 调用 没法直接使用wx

直接在 class中使用 wx 打包的时候报错 找不到微信对象 于是迂回了一下解决了这个问题 在需要使用的 class中申明一下 public Wi: any window;public Wx: any this.Wi.wx; 转载于:https://www.cnblogs.com/lurenjiazrj/p/9717075.html