介绍

  最近在做好友列表的时候,仿照微信的好友列表,A-Z索引,需要用到好友名字的拼音,之前已经有封装好拼音的工具类,但是最近发现对于一些多音字,姓氏的处理没有做到位,比如姓氏单(shan),由于对于多音字没有做一些处理,仅仅只是取多音字列表的第一个,所以取到的拼音是dan,所以利用空闲的时间对这个拼音的工具类进行了处理。

常见姓氏拼音

SimpleArrayMap<Character, String> surnames = new SimpleArrayMap<>(35);surnames.put('乐', "yue");surnames.put('乘', "sheng");surnames.put('乜', "nie");surnames.put('仇', "qiu");surnames.put('会', "gui");surnames.put('便', "pian");surnames.put('区', "ou");surnames.put('单', "shan");surnames.put('参', "shen");surnames.put('句', "gou");surnames.put('召', "shao");surnames.put('员', "yun");surnames.put('宓', "fu");surnames.put('弗', "fei");surnames.put('折', "she");surnames.put('曾', "zeng");surnames.put('朴', "piao");surnames.put('查', "zha");surnames.put('洗', "xian");surnames.put('盖', "ge");surnames.put('祭', "zhai");surnames.put('种', "chong");surnames.put('秘', "bi");surnames.put('繁', "po");surnames.put('缪', "miao");surnames.put('能', "nai");surnames.put('蕃', "pi");surnames.put('覃', "qin");surnames.put('解', "xie");surnames.put('谌', "shan");surnames.put('适', "kuo");surnames.put('都', "du");surnames.put('阿', "e");surnames.put('难', "ning");surnames.put('黑', "he");

效果图

拼音的获取

上图获取的拼音内容如下:


pinyin: QINTANGpinyin: QIULANpinyin: SHANDANpinyin: ZENGERpinyin: #

可以看到姓氏的拼音是正确的,最后一个由于不是以汉字开头,所以其拼音的内容是#

获取拼音的方法

public static String getPinyin(String str) {// 设置拼音结果的格式HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();format.setCaseType(HanyuPinyinCaseType.UPPERCASE);// 设置为大写形式format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);// 不用加入声调StringBuilder sb = new StringBuilder();char[] charArray = str.toCharArray();for (int i = 0; i < charArray.length; i++) {char c = charArray[i];if (Character.isWhitespace(c)) {// 如果是空格则跳过continue;}if (isHanZi(c)) {// 如果是汉字String s = "";try {if (i == 0){//如果是第一个,则使用获取姓氏s = getSurnamePinyin(String.valueOf(c));}else{// toHanyuPinyinStringArray 返回一个字符串数组是因为该汉字可能是多音字,此处只取第一个结果s = PinyinHelper.toHanyuPinyinStringArray(c, format)[0];}sb.append(s);} catch (BadHanyuPinyinOutputFormatCombination e) {e.printStackTrace();sb.append(s);}} else {// 不是汉字if (i == 0) {if (isEnglish(c)) {// 第一个属于字母,则返回该字母return String.valueOf(c).toUpperCase(Locale.ENGLISH);}return "#"; // 不是的话返回#号}}}return sb.toString();}

主要的逻辑是,将字符串拆解成字符数组,遍历每个字符:

  1. 如果第一个是汉字,则获取调用getSurnamePinyin()方法,获取其对应的拼音,这个方法主要是对姓氏的处理;
  2. 如果第一个字符是英文,则直接返回该字符的大写;
  3. 如果第一个字符不是汉字也不是英文,则直接返回"#"号;

如何判断是否是汉字

 public static boolean isHanZi(char c) {Pattern pattern = Pattern.compile("[\\u4e00-\\u9fa5]+");Matcher matcher = pattern.matcher(String.valueOf(c));return matcher.matches();}

通过如上方法,使用正则表达式匹配,如果满足,则说明是汉字,返回true。

如何判断是否是英文

 public static boolean isEnglish(char c) {return String.valueOf(c).matches("^[a-zA-Z]*");}

获取姓氏的拼音

 public static String getSurnamePinyin(CharSequence name) {if (name == null || name.length() == 0) return null;char ch = name.charAt(0);if (surnames.containsKey(ch)) {String s = surnames.get(ch);return s.toUpperCase(Locale.ENGLISH);}if (ch >= 0x4E00 && ch <= 0x9FA5) {int sp = (ch - 0x4E00) * 6;return pinyinTable.substring(sp, sp + 6).trim().toUpperCase(Locale.ENGLISH);} else {return String.valueOf(ch).toUpperCase(Locale.ENGLISH);}}

通过查找已经存储在map中对应姓氏的拼音

相关代码

PinyinUtils代码:

https://github.com/chaychan/BlogFileResource/blob/master/phone/PinyinUtils.java

依赖到的jar包,pinyin4j-2.5.0.jar下载:

https://raw.githubusercontent.com/chaychan/BlogFileResource/master/phone/libs/pinyin4j-2.5.0.jar

拼音工具类PinyinUtils相关推荐

  1. android 字体像素转换工具类_Android开发之拼音转换工具类PinyinUtils示例

    本文实例讲述了Android开发之拼音转换工具类PinyinUtils.分享给大家供大家参考,具体如下: 1.首先下载pinyin4j-2.5.0.jar,拷贝到工程的lib目录里 或者点击此处本站下 ...

  2. java 中文转拼音_JAVA 将中文转化为拼音工具类

    将pinyin4j-2.5.0.jar (附件中有,记得解压)加入到classpath中. 工具类PinyinUtils代码见下:package com.test.utils; import net. ...

  3. 中文转换为拼音工具类(很全)

    中文转换为拼音工具类(很全) 1.所需的jar包 2.工具类(可以直接拿去用) 1.所需的jar包 <!--获取汉字的拼音--><dependency><groupId& ...

  4. Java汉字转换拼音工具类

    1. 使用pinyin4j 1.1 引入相关maven依赖 <dependency><groupId>com.belerweb</groupId><artif ...

  5. Java汉字转为拼音工具类

    依赖文件 <!-- https://mvnrepository.com/artifact/com.belerweb/pinyin4j --><dependency><gr ...

  6. Java 文字转拼音工具类

    需要引入的pom <dependency><groupId>com.belerweb</groupId><artifactId>pinyin4j< ...

  7. 汉字转拼音(工具类)

    2019独角兽企业重金招聘Python工程师标准>>> package com.qst.tesc.course.web.rest.util; import java.io.Unsup ...

  8. Java 中文转拼音工具类 (附带长度转换 2:1)

    Java 中文转拼音工具类 (附带长度转换 2:1) import com.google.common.collect.Lists; import com.google.common.collect. ...

  9. 汉字转拼音工具类,依赖Pinyin4J

    汉字转拼音工具类,依赖Pinyin4J Maven 坐标 <dependency><groupId>com.belerweb</groupId><artifa ...

  10. java汉字转拼音工具类源代码

    原文:java汉字转拼音工具类源代码 源代码下载地址:http://www.zuidaima.com/share/1550463387880448.htm 汉字转拼音 Pinyin pinyin = ...

最新文章

  1. P1283 平板涂色
  2. [蓝桥杯][2018年第九届真题]小朋友崇拜圈(简单图论)
  3. YbtOJ#20064-[NOIP2020模拟赛B组Day4]预算缩减【树形dp】
  4. java asm tree_使用ASM 4处理Java类文件–第二部分:Tree API
  5. SharePoint REST API - 一个请求批量操作
  6. PDF 全部转为图片再用百度AI接口识别表格
  7. Git检查现有 SSH 密钥
  8. ERP软件高效排产计划:如何解决企业排产难题
  9. element-ui组件的下载与安装
  10. Mac系统-重置MySQL登陆密码
  11. 难难难!如何求图的某一顶点到其他顶点最短距离?迪杰斯特拉Dijkstra和弗洛伊德Floyd要上场了
  12. 【MineCraft】-- 学习我的世界Mod制作引雷附魔书与事件
  13. 红牛农场JAVA_JAVA内部类与异常类
  14. Thinking in BigData(二)大数据时代下的变革
  15. mysql 3日内_一门三父子
  16. 两种 HTTP 请求方法
  17. ps切图--图层切图
  18. qlearningα越大或越小_高频电子线路习题及答案
  19. 【OCR系列之一】字符识别技术总览
  20. ZZULIOJ1030

热门文章

  1. 70 个数据分析常用网址!
  2. canvas-八卦图和时钟实现
  3. 身份证校验规则Js代码
  4. 蘑菇战争2显示没有连接服务器,蘑菇战争2新手怎么玩?四步带你解决新手难关[多图]...
  5. Hadoop 3.x 的组成 完整使用 (月薪过万 第三章)
  6. 花瓣网画板上多张图片如何快速复制保存到
  7. Discuz 模板目录结构注释说明
  8. 前端面试自我介绍话术
  9. 思考的力量-总结-脑图
  10. 千万级敏感词过滤设计