进入了媒资行业,项目需求需要将片名生成拼音并支持多音字处理,主要使用pinyin4j库。结合业务跟网上的例子,整理了一个拼音处理工具类。
项目中需要引入jar包:

<dependency><groupId>com.belerweb</groupId><artifactId>pinyin4j</artifactId><version>2.5.1</version></dependency>

工具类代码如下:

package com.mgtv.media.vrs.util;import lombok.extern.slf4j.Slf4j;
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.lang3.StringUtils;import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** 拼音处理类* <p>* https://blog.51cto.com/273066044/1596126?source=dra* https://blog.csdn.net/sunshine_YG/article/details/89642788** @author :* @date :Created in 2019/12/16 17:42*/
@Slf4j
public class PinyinUtil {/*** 汉字转换位汉语拼音首字母,英文字符不变,特殊字符丢失 支持多音字,生成方式如(长沙市长:cssc,zssz,zssc,cssz)** @param chines 汉字* @return 拼音*/private static String converterToFirstSpell(String chines) {StringBuffer pinyinName = new StringBuffer();char[] nameChar = chines.toCharArray();HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);for (int i = 0; i < nameChar.length; i++) {if (nameChar[i] > 128) {try {// 取得当前汉字的所有全拼String[] strs = PinyinHelper.toHanyuPinyinStringArray(nameChar[i], defaultFormat);if (strs != null) {for (int j = 0; j < strs.length; j++) {// 取首字母pinyinName.append(strs[j].charAt(0));if (j != strs.length - 1) {pinyinName.append(",");}}}} catch (BadHanyuPinyinOutputFormatCombination e) {log.error("PinyinUtil报错", e);}} else {pinyinName.append(nameChar[i]);}pinyinName.append(" ");}return parseTheChineseByObject(discountTheChinese(pinyinName.toString()));}/*** 汉字转换位汉语全拼,英文字符不变,特殊字符丢失* 支持多音字,生成方式如(重当参:zhongdangcen,zhongdangcan,chongdangcen* ,chongdangshen,zhongdangshen,chongdangcan)** @param chines 汉字* @return 拼音*/private static String converterToSpell(String chines) {StringBuffer pinyinName = new StringBuffer();char[] nameChar = chines.toCharArray();HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);for (int i = 0; i < nameChar.length; i++) {if (nameChar[i] > 128) {try {// 取得当前汉字的所有全拼String[] strs = PinyinHelper.toHanyuPinyinStringArray(nameChar[i], defaultFormat);if (strs != null) {for (int j = 0; j < strs.length; j++) {pinyinName.append(strs[j]);if (j != strs.length - 1) {pinyinName.append(",");}}}} catch (BadHanyuPinyinOutputFormatCombination e) {log.error("拼音转换报错", e);}} else {pinyinName.append(nameChar[i]);}pinyinName.append(" ");}// return pinyinName.toString();return parseTheChineseByObject(discountTheChinese(pinyinName.toString()));}/*** 去除多音字重复数据** @param theStr* @return*/private static List<Map<String, Integer>> discountTheChinese(String theStr) {// 去除重复拼音后的拼音列表List<Map<String, Integer>> mapList = new ArrayList<Map<String, Integer>>();// 用于处理每个字的多音字,去掉重复Map<String, Integer> onlyOne = null;String[] firsts = theStr.split(" ");// 读出每个汉字的拼音for (String str : firsts) {onlyOne = new Hashtable<String, Integer>();String[] china = str.split(",");// 多音字处理for (String s : china) {Integer count = onlyOne.get(s);if (count == null) {onlyOne.put(s, new Integer(1));} else {onlyOne.remove(s);count++;onlyOne.put(s, count);}}mapList.add(onlyOne);}return mapList;}/*** 解析并组合拼音,对象合并方案(推荐使用)** @return*/private static String parseTheChineseByObject(List<Map<String, Integer>> list) {Map<String, Integer> first = null; // 用于统计每一次,集合组合数据// 遍历每一组集合for (int i = 0; i < list.size(); i++) {// 每一组集合与上一次组合的MapMap<String, Integer> temp = new Hashtable<String, Integer>();// 第一次循环,first为空if (first != null) {// 取出上次组合与此次集合的字符,并保存for (String s : first.keySet()) {for (String s1 : list.get(i).keySet()) {String str = s + s1;temp.put(str, 1);}}// 清理上一次组合数据if (temp != null && temp.size() > 0) {first.clear();}} else {for (String s : list.get(i).keySet()) {String str = s;temp.put(str, 1);}}// 保存组合数据以便下次循环使用if (temp != null && temp.size() > 0) {first = temp;}}String returnStr = "";if (first != null) {// 遍历取出组合字符串for (String str : first.keySet()) {returnStr += (str + ",");}}if (returnStr.length() > 0) {returnStr = returnStr.substring(0, returnStr.length() - 1);}return returnStr;}/*** 将字符串中的中文转化为拼音,英文字符不变* <p>* 例:    举个栗子,abc123* 返回值: JugeLiZiabc123*/private static String getPinYin(String inputString) {inputString = cleanChar(inputString);HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();format.setCaseType(HanyuPinyinCaseType.LOWERCASE);format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);format.setVCharType(HanyuPinyinVCharType.WITH_V);String output = "";if (inputString != null && inputString.length() > 0 && !"null".equals(inputString)) {char[] input = inputString.trim().toCharArray();try {for (int i = 0; i < input.length; i++) {if (java.lang.Character.toString(input[i]).matches("[\\u4E00-\\u9FA5]+")) {String[] temp = PinyinHelper.toHanyuPinyinStringArray(input[i], format);String tmp = temp[0];tmp = getFistCharToUpperCase(tmp);output += tmp;} else {output += java.lang.Character.toString(input[i]);}}} catch (BadHanyuPinyinOutputFormatCombination e) {log.error("拼音转换报错", e);}} else {return "*";}return output;}/*** 将首字母变成大写** @param str* @return*/public static String getFistCharToUpperCase(String str) {if (StringUtils.isEmpty(str)) {return StringUtils.EMPTY;}char[] chars = str.toCharArray();if (chars[0] >= 'a' && chars[0] <= 'z') {chars[0] = (char) (chars[0] - 32);}return new String(chars);}/*** 清理特殊字符以便得到* <p>* 例:    举个栗子,abc123* 返回值: 举个栗子abc123*/public static String cleanChar(String chines) {chines = chines.replaceAll("[\\p{Punct}\\p{Space}]+", ""); // 正则去掉所有字符操作// 正则表达式去掉所有中文的特殊符号String regEx = "[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}<>《》【】‘;:”“’。,、?]";Pattern pattern = Pattern.compile(regEx);Matcher matcher = pattern.matcher(chines);chines = matcher.replaceAll("").trim();return chines;}/*** 汉字转拼音缩写** @param str* @return 2007快乐男声 2007kyns|2007klns  多音字竖线分隔*/public static String getSimpleSpell(String str) {if (StringUtils.isEmpty(str)) {return StringUtils.EMPTY;}str = cleanChar(str);return converterToFirstSpell(str).replaceAll(",", "|");}/*** 汉字转换成全拼,不区分多音字** @param str* @return 2007快乐男声 2007KuaiLeNanSheng*/public static String getFullSpell(String str) {if (StringUtils.isEmpty(str)) {return StringUtils.EMPTY;}return getPinYin(str);}/*** 取单个字符的拼音声母** @param simpleSpell* @return*/public static String getInital(String simpleSpell) {if (StringUtils.isEmpty(simpleSpell))return "";simpleSpell = simpleSpell.trim().toLowerCase();if (simpleSpell.length() == 0)return "";char[] clist = simpleSpell.toCharArray();for (char c : clist) {if ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9'))return getFilter(java.lang.Character.toString(c));}return "";}/*** 字符串过滤** @param str* @return*/private static String getFilter(String str) {if (StringUtils.isEmpty(str))return "";str = str.replaceAll("[^a-zA-Z0-9]", "");return str;}public static void main(String[] args) {String s = "快乐大本营,abc123";System.out.println(getSimpleSpell(s));System.out.println(getFullSpell(s));System.out.println(getFilter(s));System.out.println(getInital(getSimpleSpell(s)));}
}

JAVA汉字拼音解析相关推荐

  1. java 汉字拼音排序_Java汉字排序(2)按拼音排序

    1.前言 对于包含汉字的字符串来说,排序的方式主要有两种: 一种是拼音,一种是笔画. 本文就讲述如何实现按拼音排序的比较器(Comparator). 作者:Jeff 发表于:2007年12月21日 1 ...

  2. php转换java工具_6款程序员必备的开源中文汉字拼音转换及处理工具 (PHP Java .net)...

    码云项目推荐 1.项目名称: 中文转拼音库 pinyin4j 项目简介:Pinyin4j 是一个流行的 Java 库,支持中文字符和拼音之间的转换.拼音输出格式可以定制. 2.项目名称:汉字/拼音转换 ...

  3. java 汉字字典,获取汉字拼音,拼音首字母,五笔,笔画,笔画顺序

    最新的可以下载的包(原来写的丢失了,重新写了个): http://download.csdn.net/detail/wssiqi/6394057 如果地址不可访问,查看我的资源,看还在不.~~~ 环境 ...

  4. java汉字转换为拼音

    java实现汉字转换拼音可以利用pinyin4j实现 1.加jar包: <dependency><groupId>com.belerweb</groupId>< ...

  5. Java汉字转拼音工具类(支持首字母和全拼)

    工具类产生是因为个人业务需求需要根据中文汉字排序,而博主又对网上回答不满意,所以才根据相关资料写了该工具类,写入博客 以备不时之需.直接上代码: Java汉字转成汉语拼音工具类,需要用到pinyin4 ...

  6. java 使用sourceforge.pinyin4j查询汉字拼音

    在我们的系统中,可能经常需要按首字母排序一些信息(比如淘宝商城的品牌列表字母序排列),那么我们就需要一个能够根据汉字查询对应的拼音,取出拼音的首字母即可. 我们使用sourceforge.pinyin ...

  7. java 汉字转换全拼、首字母拼音

    最近接到需求,要求商城中进行半模糊搜索时,输入拼音字母同样要求进行自动匹配出相关品牌.类目.关键词等数据,从而进行筛选商品 本片内容只记录汉字转换拼音 方案一:在mysql数据库中编写函数,此方法存在 ...

  8. Java 汉字转换为拼音字符串

    本文本着学习分享的目的,介绍一种基于java.text.Collator的比较挫的方法,实现汉字转换为拼音字符串.当然我得暂时不考虑汉字多音字的问题.最终结果是这样: 吃 -> CHI    睡 ...

  9. Java汉字转拼音(全拼、首字母拼)

    Java汉字转拼音(全拼.首字母拼) public class ChineseToEnglish { /*** 汉字转拼音* @param src* @return*/public static St ...

最新文章

  1. 从零学习 vim 一个多月, 感觉最有用的三个教程
  2. 解决alibaba-dubbo调用findFirstNonLoopbackHostInfo导致启动慢
  3. 页面中文显示问题之终结
  4. Java二分查找、折半查找
  5. Ybt#452-序列合并【期望dp】
  6. 前端处理带t的时间_适合家用的跑步机?阿迪达斯轻爵T-19i跑步机测评|adidas|商用机...
  7. 谷歌浏览器中打开IE
  8. 微信WeixinJSBridge API 屏蔽右上角分享等常用方法
  9. c语言折半查找法找字符,C语言折半查找法练习题冒泡排序
  10. 你知道吗?macOS Sierra修复漏洞超过60个
  11. 纯css控制-表格表头固定,内容多时滚动内容
  12. Centos7端口查看命令
  13. 2020认证杯第二阶段选提建议
  14. oracle查看已经创建的同义词,创建同义词synonym
  15. 哥德巴赫猜想 php,C++_c++验证哥德巴赫猜想,哥德巴赫猜想是世界近代三大 - phpStudy...
  16. 视频 | “资本运作悍匪”应书岭的“英雄梦”
  17. 【中途相遇法】【STL】BAPC2014 K Key to Knowledge (Codeforces GYM 100526)
  18. 机器学习——朴素贝叶斯分类
  19. java入门基础学习
  20. DH ERP系统权限设计

热门文章

  1. 关于MySql的Unhandled异常
  2. java中提示确认_javascript对话框使用方法(警告框 javascript确认框 提示框)
  3. java web 爬虫_Java开源Web爬虫项目
  4. Nginx编译安装及配置文件详解
  5. C语言幻方矩阵的求解
  6. 怎么解除计算机网络密码,电脑怎么解除密码
  7. 【每日一GO】时间处理库—Carbon
  8. 诺基亚论坛PRO数位红
  9. C#使用OleDB操作ACCESS插入数据时提示:标准表达式中数据类型不匹配。
  10. 两台电脑怎么快速互传大量文件