java实现汉字转拼音

 更新时间:2015年12月25日 16:17:46   作者:xiaojimanman  
这篇文章主要介绍了java实现汉字转拼音的功能,感兴趣的小伙伴们可以参考一下

一、问题描述
汉字转化为对应的拼音或者获取汉字拼音的首字母,这些都是在开发中经常遇到的问题,在获取汉字的拼音或者拼音的首字母之后,我们在推荐或者搜索部门可以很大程度提高用户的体验,比如用户输入“NH”,我们就可以联想出“你好”、“你会”、“年后”、“内涵”等词语。在Java中,pinyin4j.jar这个工具很好实现了将汉字转化为对应的拼音,下面我们就介绍下如何使用这个jar包。

二、资源下载
下载之后解压,直接使用文件中的pinyin4j-2.5.0.jar即可。

三、提供方法
我们可以使用HanyuPinyinOutputFormat类来设置拼音的返回方式,比如设置拼音的大小写、音标方式以及拼音ü的显示形式,具体如下图:

直接使用PinyinHelper中的方法来对汉字做对应的转化,具体有如下三种,三种效果如何自己做下测试即可:

四、编写代码
针对我们平常可能用到的功能,我做了如下的封装,提供的功能还有具体的实现步骤参照代码中的注释:

package com.lulei.util; 
import java.util.ArrayList; 
import java.util.List; 
 
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; 
  
public class PinYinUtil { 
  private static HanyuPinyinOutputFormat format = null; 
  static { 
    format = new HanyuPinyinOutputFormat(); 
    //拼音小写 
    format.setCaseType(HanyuPinyinCaseType.LOWERCASE); 
    //无音标方式;WITH_TONE_NUMBER:1-4数字表示英标;WITH_TONE_MARK:直接用音标符(必须WITH_U_UNICODE否则异常 
    format.setToneType(HanyuPinyinToneType.WITHOUT_TONE); 
    //用v表示ü 
    format.setVCharType(HanyuPinyinVCharType.WITH_V); 
  } 
   
  /** 
   * @param str 
   * @return 
   * @Description: 返回字符串的拼音 
   */ 
  public static String[] getCharPinYinString(String str) { 
    if (str == null || str.length() < 1) { 
      return null; 
    } 
    List<String> result = new ArrayList<String>(); 
    //对字符串中的记录逐个分析 
    for (int i = 0; i < str.length(); i++) { 
      result = getCharPinYinString(str.charAt(i), result); 
    } 
    return result.toArray(new String[result.size()]); 
  } 
   
  /** 
   * @param c 
   * @param list 
   * @return 
   * @Description: 将字符c的拼音拼接到list中的记录中 
   */ 
  private static List<String> getCharPinYinString(char c, List<String> list) { 
    String[] strs = getCharPinYinString(c); 
    List<String> result = new ArrayList<String>(); 
    //如果解析出的拼音为空,判断字符C是否为英文字母,如果是英文字母则添加值拼音结果中 
    if (strs == null) { 
      if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { 
        c = c <= 91 ? (char)(c + 32) : c; 
        if (list == null || list.size() == 0) { 
          result.add(c + ""); 
        } else { 
          for (String s : list) { 
            result.add(s + c); 
          } 
        } 
        return result; 
      } 
      return list; 
    } 
    //将字符C的拼音首和已存在的拼音首组合成新的记录 
    for (String str : strs) { 
      if (list == null || list.size() == 0) { 
        result.add(str); 
      } else { 
        for (String s : list) { 
          result.add(s + str); 
        } 
      } 
    } 
    return result; 
  } 
   
  /** 
   * @param c 
   * @return 
   * @Description: 返回汉字的拼音 
   */ 
  public static String[] getCharPinYinString(char c) { 
    try { 
      //返回字符C的拼音 
      return PinyinHelper.toHanyuPinyinStringArray(c, format); 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
    return null; 
  } 
   
  /** 
   * @param str 
   * @return 
   * @Description: 返回字符串的拼音的首字母 
   */ 
  public static String[] getCharPinYinChar(String str) { 
    if (str == null || str.length() < 1) { 
      return null; 
    } 
    List<String> result = new ArrayList<String>(); 
    //对字符串中的记录逐个分析 
    for (int i = 0; i < str.length(); i++) { 
      result = getCharPinYinChar(str.charAt(i), result); 
    } 
    return result.toArray(new String[result.size()]); 
  } 
   
  /** 
   * @param c 
   * @param list 
   * @return 
   * @Description: 将字符c的拼音首字母拼接到list中的记录中 
   */ 
  private static List<String> getCharPinYinChar(char c, List<String> list) { 
    char[] chars = getCharPinYinChar(c); 
    List<String> result = new ArrayList<String>(); 
    //如果解析出的拼音为空,判断字符C是否为英文字母,如果是英文字母则添加值拼音结果中 
    if (chars == null) { 
      if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { 
        c = c < 91 ? (char)(c + 32) : c; 
        if (list == null || list.size() == 0) { 
          result.add(c + ""); 
        } else { 
          for (String s : list) { 
            result.add(s + c); 
          } 
        } 
        return result; 
      } 
      return list; 
    } 
    //将字符C的拼音首字母和已存在的拼音首字母组合成新的记录 
    for (char ch : chars) { 
      if (list == null || list.size() == 0) { 
        result.add(ch + ""); 
      } else { 
        for (String s : list) { 
          result.add(s + ch); 
        } 
      } 
    } 
    return result; 
  } 
   
  /** 
   * @param c 
   * @return 
   * @Description:返回汉字拼音首字母 
   */ 
  public static char[] getCharPinYinChar(char c) { 
    //字符C的拼音 
    String[] strs = getCharPinYinString(c); 
    if (strs != null) { 
      //截取拼音的首字母 
      char[] chars = new char[strs.length]; 
      for(int i = 0; i <chars.length; i++) { 
        chars[i] = strs[i].charAt(0); 
      } 
      return chars; 
    } 
    return null; 
  } 
   
  public static void main(String[] args) { 
    // TODO Auto-generated method stub  
    char c = "重庆".charAt(0); 
    String[] str = PinYinUtil.getCharPinYinString(c); 
    for(String s : str) { 
      System.out.println(s); 
    } 
     
    char[] chars = PinYinUtil.getCharPinYinChar(c); 
    for(char c1 : chars) { 
      System.out.println(c1); 
    } 
     
    str = PinYinUtil.getCharPinYinString("重庆c"); 
    for(String s : str) { 
      System.out.println(s); 
    } 
     
    str = PinYinUtil.getCharPinYinChar("重庆a"); 
    for(String s : str) { 
      System.out.println(s); 
    } 
  } 
 
} 

五、输出结果

以上就是java实现汉字转拼音的全部内容,希望对大家的学习有所帮助。

相关文章

  • SpringBoot热部署Springloaded实现过程解析

    SpringBoot热部署Springloaded实现过程解析

    这篇文章主要介绍了SpringBoot热部署Springloaded实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Java对敏感数据进行加密的方法详解

    Java对敏感数据进行加密的方法详解

    敏感数据的加密是数据安全的重要方面,尤其是对于手机号和身份证号这类个人信息,本文主要为大家介绍了Java对敏感数据进行加密的相关方法,希望对大家有所帮助
    2024-03-03
  • Springboot消除switch-case过程解析

    Springboot消除switch-case过程解析

    这篇文章主要介绍了Springboot消除switch-case过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 单元测试 @mock与@SpringBootTest的使用

    单元测试 @mock与@SpringBootTest的使用

    这篇文章主要介绍了单元测试 @mock与@SpringBootTest的使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • java中JSONObject转换为HashMap(方法+main方法调用实例)

    java中JSONObject转换为HashMap(方法+main方法调用实例)

    这篇文章主要介绍了java中JSONObject转换为HashMap(方法+main方法调用实例),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • SpringBoot整合MybatisPlus的基本应用详解

    SpringBoot整合MybatisPlus的基本应用详解

    MyBatis-Plus (简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为 简化开发、提高效率而生,本文将给大家介绍一下SpringBoot整合MybatisPlus的基本应用,需要的朋友可以参考下
    2024-05-05
  • 如何解决@PutMapping或@PostMapping接收String类型参数多两个“引号问题

    如何解决@PutMapping或@PostMapping接收String类型参数多两个“引号问题

    这篇文章主要介绍了如何解决@PutMapping或@PostMapping接收String类型参数多两个“引号问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Java实现文件压缩为zip和解压zip压缩包

    Java实现文件压缩为zip和解压zip压缩包

    这篇文章主要为大家介绍了Java如何实现将文件压缩为zip以及解压zip压缩包,文中的示例代码讲解详细,感兴趣的小伙伴可以动手尝试一下
    2022-06-06
  • 详细分析Java中String、StringBuffer、StringBuilder类的性能

    详细分析Java中String、StringBuffer、StringBuilder类的性能

    在Java中,String类和StringBuffer类以及StringBuilder类都能用于创建字符串对象,而在分别操作这些对象时我们会发现JVM执行它们的性能并不相同,下面我们就来详细分析Java中String、StringBuffer、StringBuilder类的性能
    2016-05-05
  • Java后台生成图片的完整步骤

    Java后台生成图片的完整步骤

    在一些详情页面中,可能需要对上传到服务器中的图片生成以缩略图的形式展示,这篇文章主要给大家介绍了关于Java后台生成图片的相关资料,需要的朋友可以参考下
    2021-08-08

最新评论