`

pinyin4j的使用代码实例

阅读更多

这是自己根据文档加上网上搜的部分资料写出来的一个pinyin4j使用的实例,主要是为了实现根据拼音以及拼音简写检索姓名使用的,拿出来大家看看哪里有bug,希望指正,好改进我写的这个工具类。

 

 

package cn.zh.common;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

/**
 * 
 * 类描述:操作汉字拼音的工具类
 * 		<br />目前此版本只支持汉字,并且如果此串中包含非汉字,则会被丢弃,不做任何处理
 * 类名称:PinyinTool
 * 创建人: sjg
 * 创建时间:2013-4-18 下午9:14:48
 * @version 1.0
 */
public class PinyinTool {
	
	/**
	 * 
	 * 方法描述:根据输入的汉语获取拼音
	 * <br />其中,本方法输出的拼音包括全拼和简拼,并且全拼和简拼都不重复
	 * 方法名:getPinyin
	 * 创建人:sjg
	 * 创建时间:2013-4-18 下午9:16:47
	 * @param str 要进行转化的汉字字符串
	 * @return
	 * 返回值:String
	 */
	public static String getPinyin(String str){
		if (str == null || "".equals(str)) {
			return null;
		}
		List<Set<String>> pinyins = getPinyinStr(str);
		if (pinyins== null || pinyins.size()<1) {
			return null;
		}
		List<String> quanpin = getQuanpinResult(pinyins, null, 0);// 获取全拼
		Set<String> jianpin = getJianpinResult(pinyins, null, 0);// 获取简拼
		StringBuilder sb = new StringBuilder();
		for(int i =0;i<quanpin.size();i++){
			if (i != quanpin.size()-1) {
				sb.append(quanpin.get(i) + ",");
			}else {
				sb.append(quanpin.get(i));
			}
		}
		Iterator<String> iterator = jianpin.iterator();
		while (iterator.hasNext()) {
			sb.append("," + iterator.next());
		}
		
		return sb.toString();
	}
	
	
	
	
	/**
	 * 
	 * 方法描述:获取首字母简拼
	 * 		<br />为了防止重复,所以,使用set
	 * 方法名:getJianpinResult
	 * 创建人:sjg
	 * 创建时间:2013-4-18 下午9:10:47
	 * @param pinyins
	 * @param curSet
	 * @param index
	 * @return
	 * 返回值:Set<String>
	 */
	public static Set<String> getJianpinResult(List<Set<String>> pinyins, Set<String> curSet, int index){
		if (pinyins == null || pinyins.size()<1) {
			return null;
		}
		Set<String> tempSet = new HashSet<String>();
		
		Set<String> pinyinSet = pinyins.get(index);
		if (curSet == null) {
			curSet = new HashSet<String>();
			for (String string : pinyinSet) {
				tempSet.add(string.charAt(0)+"");
			}
		}else {
			for (String oldPinyin : curSet) {
				for (String newPinyin : pinyinSet) {
					tempSet.add(oldPinyin + newPinyin.charAt(0));
				}
			}
		}
		
		if (index == pinyins.size()-1) {
			return tempSet;
		}else {
			return getJianpinResult(pinyins, tempSet, ++index);
		}
	}
	
	
	
	
	/**
	 * 
	 * 方法描述: 获取所有的全拼结果
	 * 方法名:getQuanpinResult
	 * 创建人:sjg
	 * 创建时间:2013-4-18 下午8:56:17
	 * @param pinyins
	 * @param curList
	 * @param index
	 * @return
	 * 返回值:List<String>
	 */
	public static List<String> getQuanpinResult(List<Set<String>> pinyins, List<String> curList, int index){
		if (pinyins == null || pinyins.size()<1) {
			return null;
		}
		List<String> tempList = new ArrayList<String>();
		
		Set<String> pinyinSet = pinyins.get(index);
		if (curList == null) {
			curList = new ArrayList<String>();
			for (String string : pinyinSet) {
				tempList.add(string);
			}
		}else {
			for (String oldPinyin : curList) {
				for (String newPinyin : pinyinSet) {
					tempList.add(oldPinyin + newPinyin );
				}
			}
		}
		
		if (index == pinyins.size()-1) {
			return tempList;
		}else {
			return getQuanpinResult(pinyins, tempList, ++index);
		}
	}
	
	
	
	
	/**
	 * 
	 * 方法描述:获取这个字符串的所有的拼音的组合
	 * 方法名:getPinyinStr
	 * 创建人:sjg
	 * 创建时间:2013-4-18 下午5:22:27
	 * @param str
	 * @return
	 * 返回值:String
	 */
	public static List<Set<String>> getPinyinStr(String str){
		if (str == null) {
			return null;
		}
		
		char[] chars = str.toCharArray();
		List<Set<String>> pinyinList = new ArrayList<Set<String>>();
		Set<String> pinyinsetSet = null;
		for (char c : chars) {// 获取所有的汉字的拼音
			pinyinsetSet = getCharacterPins(c);
			if (pinyinsetSet != null) {
				pinyinList.add(pinyinsetSet);
			}
		}
		
		return pinyinList;
	}
	
	
	/**
	 * 
	 * 方法描述:获取单个字符的拼音
	 * 	<br/>由于我的需求是不要声调,相同读音的拼音便不要重复出现了,所以,选择使用set
	 * 方法名:getCharacterPins
	 * 创建人:sjg
	 * 创建时间:2013-4-18 下午5:07:52
	 * @param c
	 * @return
	 * 返回值:Set<String>
	 */
	public static Set<String> getCharacterPins(char c){
		HanyuPinyinOutputFormat format = getFormat();
		String[] pinyins = null;
		try {
			// 获取拼音
			 pinyins = PinyinHelper.toHanyuPinyinStringArray(c, format);
		} catch (BadHanyuPinyinOutputFormatCombination e) {
			e.printStackTrace();
		}
		
		Set<String> pinyinset = null;				
		// 发生异常或者字符不是拼音的时候,pins都有可能是null,所以,必须进行判断
		if (pinyins != null) {
			pinyinset = new HashSet<String>();
			for (String pinyin : pinyins) {
				pinyinset.add(pinyin);
			}
		}
		
		return pinyinset;
	}
	
	
	/**
	 * 
	 * 方法描述:获取HanyuPinyinOutputFormat的实例
	 * 方法名:getFormat
	 * 创建人:sjg
	 * 创建时间:2013-4-18 下午5:06:11
	 * @return
	 * 返回值:HanyuPinyinOutputFormat
	 */
	private static HanyuPinyinOutputFormat getFormat(){
		
		HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
		format.setCaseType(HanyuPinyinCaseType.LOWERCASE);// 小写
		format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);// 声调不要
		format.setVCharType(HanyuPinyinVCharType.WITH_V);
		return format;
	}
	
	public static void main(String[] args) {
		System.out.println(getPinyin("aa商建国"));
	}
	
}

 

2
7
分享到:
评论
4 楼 商人shang 2013-04-21  
Dead_knight 写道
pinyin4j的原理是根据java的unicode编码转换过来的,它的jar包下面有个pinyindb文件夹,里面有个unicode_to_hanyu_pinyin.txt文件,里面是汉字编码与拼音的映射表。这个映射文件中括号里面以逗号分隔的就是多音字。

恩,我还没有仔细看过了,谢了,要不然我还不知道他是怎么实现的呢
3 楼 Dead_knight 2013-04-21  
pinyin4j的原理是根据java的unicode编码转换过来的,它的jar包下面有个pinyindb文件夹,里面有个unicode_to_hanyu_pinyin.txt文件,里面是汉字编码与拼音的映射表。这个映射文件中括号里面以逗号分隔的就是多音字。
2 楼 商人shang 2013-04-20  
53873039oycg 写道
汉字中的多音字你怎么处理的?像单、朴..


PinyinHelper.toHanyuPinyinStringArray()返回的是一个数组,也就是其不同的读音,包括同音不同调的各种情况。因为要在数据库中根据拼音查询,所以,同音不同掉的只需要一个就行了,所以,我这是是吧这些放到一个set中,可以避免同音不同调的拼音出现多次。你可以根据自己的需求来定。
1 楼 53873039oycg 2013-04-20  
汉字中的多音字你怎么处理的?像单、朴..

相关推荐

    pinyin4j jar包 相关实例 混排实例

    本文将深入探讨pinyin4j jar包的使用,包括它的最新特性,以及在实际项目中的应用实例,特别是中文和拼音的混排实例。 首先,pinyin4j是一个开源的Java库,主要功能是将汉字转换为汉语拼音,支持声调标注和多种拼音...

    pinyin4j版本为2.5.0

    本文将深入探讨pinyin4j 2.5.0版本,了解其工作原理和应用实例。 pinyin4j是一个开源的Java库,设计用于将中文字符转换为汉语拼音。该库由Adam BIelik开发,提供了简单易用的API,使得开发者能够在项目中轻松集成...

    中文转拼音:pinyin4j-2.5.0包及实例

    使用`pinyin4j`进行中文转拼音的实例代码大致如下: ```java import net.sourceforge.pinyin4j.PinyinHelper; public class PinyinExample { public static void main(String[] args) { String hanzi = "汉字"; ...

    pinyin4jJar包及java实例

    在给定的Java实例中,名为"Pinyin4jUtil.java"的文件,包含了使用pinyin4j库的方法。这些方法可能包括但不限于以下几种: 1. **全拼转换**:例如`getFullPinyin(String str)`方法,用于将输入的汉字字符串转化为...

    pinyin4j.zip

    Pinyin4j的使用非常简单,只需在项目中引入相应的依赖,即可快速地集成到代码中。它的主要类包括`HanyuPinyinOutputFormat`和`PinyinHelper`。`HanyuPinyinOutputFormat`用于设置拼音输出的格式,如是否显示声调、...

    pinyin4j资源V2.5.0.rar

    8. demo.java:示例代码,提供了如何使用pinyin4j进行汉字转拼音的实例,是快速入门的好帮手。 通过这些文件,开发者可以了解pinyin4j的基本用法和实现原理。例如,通过阅读`demo.java`,我们可以看到如何创建`...

    pinyin4j_jar包和实例及文档

    本篇文章将详细探讨pinyin4j库的核心功能、使用方法以及相关实例,帮助读者深入理解并熟练运用这个工具。 pinyin4j库主要提供了两个核心功能:一是将汉字转换为全拼音,二是提取每个汉字的首字母。这些功能在许多...

    基于Java的实例源码-中文转拼音库 pinyin4j.zip

    【标题】"基于Java的实例源码-中文转拼音库 pinyin4j.zip" 提供的是一个用Java语言实现的中文转拼音的工具库——Pinyin4j的源代码。这个库广泛应用于需要将中文字符转化为拼音的场景,如搜索引擎索引、文本处理或...

    Java汉字转拼音类库Pinyin4j详细使用方法与实例

    Java汉字转拼音类库Pinyin4j详细使用方法与实例 Pinyin4j是一个Java类库,用于将汉字转换为拼音。下面是Pinyin4j的详细使用方法与实例: 1.基本用法 Pinyin4j的使用非常方便,基本转换只需要使用PinyinHelper类的...

    中文转拼音库 pinyin4j.7z

    使用pinyin4j的基本步骤包括引入库依赖,实例化处理对象,然后调用相应方法进行转换。以下是一个简单的Java代码示例: ```java import net.sourceforge.pinyin4j.PinyinHelper; public class PinyinExample { ...

    中文转拼音库 pinyin4j示例源码

    3. **src**:源代码目录,包含了`pinyin4j`库的Java源文件。在这里,你可以看到如何实现汉字到拼音的转换逻辑,包括对字典文件的处理、拼音规则的匹配等。通过阅读这些源码,可以深入了解库的内部运作机制,这对于...

    C#汉字转拼音

    2. 创建实例:创建一个PinyinHelper对象,它是Pinyin4j.Net的核心类,负责处理汉字转拼音的工作。 3. 转换汉字:使用PinyinHelper的ToPinyinString方法,传入汉字字符串,即可得到对应的拼音字符串。该方法支持多种...

    pinyin4jUtils.zip

    在"pinyin4j-2.5.0.zip"这个子文件中,包含了Pinyin4j库的源代码和二进制文件。这个版本是2.5.0,开发者可以查看源码理解其内部工作原理,也可以直接引入二进制文件到自己的项目中使用。通常,使用Pinyin4j的方式是...

    Java中汉字转拼音pinyin4j用法实例分析

    本篇文章将深入探讨pinyin4j的用法,并提供实例分析。 首先,我们需要了解如何获取和使用pinyin4j库。你可以从SourceForge的官方网站(http://sourceforge.net/projects/pinyin4j/)下载pinyin4j的最新版本,如...

    PinYin.zip

    2. **创建对象**:创建`PinyinHelper`类的实例,这是pinyin4j提供的主要接口,用于进行拼音转换。 3. **转换汉字**:通过`PinyinHelper.toHanyuPinyinStringArray()`方法,可以将单个汉字或字符串中的汉字转换为拼音...

    钉钉生成用户名默认头像01

    `pinyin4j-2.5.0.jar`是一个重要的依赖库,它用于处理汉字到拼音的转换。在生成头像时,如果用户名包含汉字,这个库会将汉字转化为拼音,然后选取后两位作为图像生成的基础。对于非汉字字符,可能直接使用原始字符。...

    汉子转化拼音代码

    本文将详细介绍一个利用`Pinyin4j`库实现汉字到拼音转换的代码实例,帮助开发者理解其工作原理和应用场景。 #### Pinyin4j库简介 `Pinyin4j`是一个开源的Java库,用于在Java应用程序中进行汉字与拼音之间的转换。...

    android 根据pinyin排序人员

    一种常见的解决方案是使用第三方库,如`hanyu-pinyin4j`或`PinYin4Android`,这些库可以将汉字转换为对应的拼音表示。`PinyinSort`可能就使用了其中的一种。 以下是实现拼音排序的基本步骤: 1. **安装库**: 在...

    java汉字转拼音字头-能运行的实例代码

    为了实现从汉字到拼音的转换,这里假设使用了第三方库`Pinyin4j`。实际应用中可能需要根据项目需求选择合适的库或方法。 ```java // 导入必要的库 import net.sourceforge.pinyin4j.PinyinHelper; import ...

Global site tag (gtag.js) - Google Analytics