在做中文搜索的时候通常需要考虑拼音搜索,这时就需要获取汉字对应的拼音(包括全拼、简拼),java语言中有pinyin4j开源类库。唯一不足的是对多音字支持不够好,于是自己在其基础上封装了一下,完美支持多音字。
核心类PinyinUtils.java如下:

package com.ricky.java.pinyin;import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.concurrent.ConcurrentHashMap;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;import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;public class PinyinUtils {private static final ConcurrentHashMap<String,String> duoYinMap = new ConcurrentHashMap<String,String>(512);public static final String pinyin_sep = "#";public static final String word_sep = "/";//加载多音字词典static{BufferedReader br = null;try {InputStream in = PinyinUtils.class.getClassLoader().getResourceAsStream("duoyinzi_pinyin.txt");br = new BufferedReader(new InputStreamReader(in,"UTF-8"));String line = null;while((line=br.readLine())!=null){String[] arr = line.split(pinyin_sep);if(StringUtils.isNotEmpty(arr[1])){String[] sems = arr[1].split(word_sep);for (String sem : sems) {if(StringUtils.isNotEmpty(sem)){duoYinMap.put(sem , arr[0]);}}}}} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally{IOUtils.closeQuietly(br);}}public static String[] chineseToPinYin(char chineseCharacter) throws BadHanyuPinyinOutputFormatCombination{HanyuPinyinOutputFormat outputFormat = new HanyuPinyinOutputFormat();outputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);outputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);outputFormat.setVCharType(HanyuPinyinVCharType.WITH_V);if(chineseCharacter>=32 && chineseCharacter<=125){  //ASCII >=33 ASCII<=125的直接返回 ,ASCII码表:http://www.asciitable.com/return new String[]{String.valueOf(chineseCharacter)};}return PinyinHelper.toHanyuPinyinStringArray(chineseCharacter, outputFormat);}/*** get chinese words pin yin* @param chinese* @param fullPy* @return* @throws BadHanyuPinyinOutputFormatCombination*/public static String getPinYin(String chinese, boolean fullPy) throws BadHanyuPinyinOutputFormatCombination{if(StringUtils.isEmpty(chinese)){return null;}char[] chs = chinese.toCharArray();StringBuilder result = new StringBuilder(20);for(int i=0;i<chs.length;i++){String[] arr = chineseToPinYin(chs[i]);if(arr==null || arr.length<1){throw new RuntimeException("not find pin yin for:"+chs[i]);}if(arr.length==1){result.append(fullPy ? arr[0]:arr[0].charAt(0));}else if(arr[0].equals(arr[1])){result.append(fullPy ? arr[0]:arr[0].charAt(0));}else{String prim = chinese.substring(i, i+1);String lst = null,rst = null;if(i<=chinese.length()-2){rst = chinese.substring(i,i+2);}if(i>=1 && i+1<=chinese.length()){lst = chinese.substring(i-1,i+1);}String answer = null;for (String py : arr) {if(StringUtils.isEmpty(py)){continue;}if((lst!=null && py.equals(duoYinMap.get(lst))) ||(rst!=null && py.equals(duoYinMap.get(rst)))){answer = py;break;}if(py.equals(duoYinMap.get(prim))){answer = py;}}if(StringUtils.isEmpty(answer)){throw new RuntimeException("not find pin yin for:"+chs[i]);}result.append(fullPy ? answer:answer.charAt(0));}}return result.toString().toLowerCase();}}

完整源码下载:https://github.com/TiFG/py4j

Java获取汉字的拼音相关推荐

  1. java获取汉字的拼音首字母_java获取汉字的拼音首字母

    import java.io.UnsupportedEncodingException; /** * 取得给定汉字串的首字母串,即声母串 * Title: ChineseCharToEn * @dat ...

  2. java 得到汉字的拼音,Java获取汉字的拼音

    /** * 获取中文全拼 * * @param src * @return */ private String getPinYin(String src) { char[] t1 = null; t1 ...

  3. java获取汉字的拼音首字母_Java获取汉字拼音首字母

    根据网上C#版和JAVA版改的.代码很短,但有些复杂的汉字取不了拼音,如"鑫"等.适用一般不是很复杂的情况. 如要更完整的版本,可以使用这个开源的pinyin4j组件.packag ...

  4. java汉字的拼音首字母_Java 获取汉字的拼音首字母

    Java 获取汉字的拼音首字母: pom.xml 引用 pinyin4j 包: com.belerweb pinyin4j 2.5.0 PinyinUtil 类: package com.xxx.co ...

  5. java汉字转换拼音,获取汉字串拼音首字母

    首先要下载  pinyin4j  的jar包 import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j ...

  6. JAVA获取汉字首字母拼音

    JAVA获取汉字首字母拼音 jar导入 工具类 jar导入 <dependency><groupId>com.belerweb</groupId><artif ...

  7. java 实现汉字转换拼音_JAVA实现汉字转拼音功能代码实例

    JAVA中汉字转拼音的方法并不复杂,可以使用pinyin4j包来实现. 一.下载pinyin4j的架包,并导入项目中,如下: 如果是maven项目,maven依赖如下: com.belerweb pi ...

  8. java实现汉字转拼音

    转载请注明出处: http://blog.csdn.net/xiaojimanman/article/details/48579073 http://www.llwjy.com/blogdetail/ ...

  9. java 实现汉字转拼音,java汉字简体转繁体 java汉字繁体转简体

    java 实现汉字转拼音,java汉字简体转繁体 java汉字繁体转简体 一.前言 java实现汉字转拼音,我的思路是需要一个字符和拼音的映射库."我"=wo,"们&qu ...

  10. Java中将汉字转为拼音

    转载请标明出处:http://blog.csdn.net/liu1252247624/article/details/51553825 源码地址:http://download.csdn.net/de ...

最新文章

  1. 4-2-串的堆存储结构-串-第4章-《数据结构》课本源码-严蔚敏吴伟民版
  2. 如何为WPF添加Main()函数
  3. java - 分页类
  4. java解析kafkaavro_如何使用Spring Kafka读取合并模式注册的AVRO消息?
  5. 取消Ajax请求 || Ajax重复请求问题
  6. [转载] 人工智能:一种现代方法——第1章 绪论
  7. Git 系列(二):初步了解 Git
  8. 3500 yuan to php,350 CNY to PHP Currency Converter - 人民币 菲律宾比索 汇率兑换
  9. [转载]VirtualBox网络配置详解
  10. JanusGraph: 可视化 Gephi 插件安装
  11. 11、Jsp加强/EL表达式/jsp标签
  12. centos LAMP菜鸟搭建过程
  13. 用户价值分层——基于RFM模型的研究分析
  14. 分析并解决SpringMVC返回406状态码
  15. python爬虫学习爬取股票数据
  16. WinForm登陆成功后跳转到主窗口
  17. 【数据库】SRA数据库介绍及数据下载
  18. Unity游戏动画 从入门到住院 1
  19. js屏蔽手机的物理返回键
  20. 基于python的多因子分析

热门文章

  1. 大型网站架构技术演进(史上最全)
  2. Linux文件编辑命令vi详细说明
  3. c语言打开文件报错 13,求帮忙看一段打开文件的代码~~真心无力了
  4. 数据预处理和特征工程1--无量纲化:数据归一化、标准化
  5. 定义一个图形抽象类,完成三角形、圆形、矩形的周长和面积计算
  6. esp32测试wifi速率
  7. 【Ubuntu】查询显卡型号
  8. 《微积分:一元函数微分学》——费马定理
  9. 车规电阻AEC-Q200测试项目及元器件检测设备
  10. 概率论第五章——总体与样本