Java汉字转拼音pinyin4j用法详解

一、工具介绍

pinyin4j 是一个支持将简体和繁体中文转换到成拼音的Java开源类库;

1. 功能

  • 支持同一汉字有多个发音
  • 还支持拼音的格式化输出,比如第几声之类的,
  • 同时支持简体中文、繁体中文转换为拼音…使用起来也非常简单。下面是其官方网址,其中提供了下载:
  • pinyin4j的官方下载地址

2. 目录结构及说明

  • doc : pinyin4j的api文档
  • lib : pinyin4j的jar包
  • src: pinyin4j的源代码
  • CHANGELOG.txt : pinyin4j的版本更新日志
  • COPYING.txt : LICENSE说明
  • README.txt : pinyin4j的概要介绍

3. 原理

pinyin4j使用了一个.txt的文本文件(uicode_to_hanyu_pinyin.txt)用来存储汉字unicode编码与拼音的对应关系,通过读取该配置文件达到转换的目的。

该属性文件存储信息的基本格式如下:89E3 (jie3,jie4,xie4) //(对应汉字”解”)89E3 是汉字对应的unicode编码的16进制数,(jie3,jie4,xie4)是该汉字对应的三种读音(在汉语里有多音字)

说明pinyin4j支持多音字的处理pinyin4j的处理过程是这样的:

根据String的toCharArray方法得到每个字符(得到”解”字的unicode编码,实际上是35299,由于java中char和String都是unicode编码的可以直接转为int型的编码数据35299),然后利用Integer.toHexString(c1).toUpperCase()将其转换成16进制数[也就是89E3],通过读取配置文件得到“解”字的拼音(jie3,jie4,xie4),那么这里有三个拼音,pinyin4j的默认取值为第一个,也就是jie3[表示读jie,声调是三声]

二、pinyin4J 使用

pinyin4j 提供的工具类为PinyinHelper,里边提供了静态方法

- toHanyuPinyinString()(过时)

- toHanyuPinyinStringArray()

pinyin4j 中有四个辅助类分别是:

- HanyuPinyinCaseType

- HanyuPinyinToneType

- HanyuPinyinVCharType

- HanyuPinyinOutputFormat

具体功能和用法见一下代码:

HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
// 控制大小写
// UPPERCASE:大写 (ZHONG)
// LOWERCASE:小写 (zhong)
defaultFormat.setCaseType(HanyuPinyinCaseType.UPPERCASE);
// WITHOUT_TONE:无音标 (zhong)
// WITH_TONE_NUMBER:1-4数字表示英标 (zhong4)
// WITH_TONE_MARK:直接用音标符(必须WITH_U_UNICODE否则异常) (zhòng)
defaultFormat.setToneType(HanyuPinyinToneType.WITH_TONE_NUMBER);
// WITH_V:用v表示ü (nv)
// WITH_U_AND_COLON:用"u:"表示ü (nu:)
// WITH_U_UNICODE:直接用ü (nü)
defaultFormat.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE);
// oHanyuPinyinStringArray如果传入的字符不是汉字不能转换成拼音,那么会直接返回null。
String[] pinyin = PinyinHelper.toHanyuPinyinStringArray('重', defaultFormat);
for(String str: pinyin){
  System.out.println(str);
}

结果:

ZHONG4

CHONG2

其他工具类

获取获得汉语拼音首字母

将字符串中的中文转化为拼音,英文字符不变

/**
 * 获得汉语拼音首字母
 *
 * @param chines
 *      汉字
 * @return
 */
public static String getAlpha(String chines) {
  String pinyinName = "";
  char[] nameChar = chines.toCharArray();
  HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
  defaultFormat.setCaseType(HanyuPinyinCaseType.UPPERCASE);
  defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
  for (int i = 0; i < nameChar.length; i++) {
    if (nameChar[i] > 128) {
      try {
        pinyinName += PinyinHelper.toHanyuPinyinStringArray(
            nameChar[i], defaultFormat)[0].charAt(0);
      } catch (BadHanyuPinyinOutputFormatCombination e) {
        e.printStackTrace();
      }
    } else {
      pinyinName += nameChar[i];
    }
  }
  return pinyinName;
}

/**
 * 将字符串中的中文转化为拼音,英文字符不变
 *
 * @param inputString
 *      汉字
 * @return
 */
public static String getPingYin(String 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);
          output += temp[0];
        } else
          output += java.lang.Character.toString(input[i]);
      }
    } catch (BadHanyuPinyinOutputFormatCombination e) {
      e.printStackTrace();
    }
  } else {
    return "*";
  }
  return output;
}

/**
 * 汉字转换为汉语拼音首字母,英文字符不变
 *
 * @param chines
 *      汉字
 * @return 拼音
 */
public static String converterToFirstSpell(String chines) {
  String pinyinName = "";
  char[] nameChar = chines.toCharArray();
  HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
  defaultFormat.setCaseType(HanyuPinyinCaseType.UPPERCASE);
  defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
  for (int i = 0; i < nameChar.length; i++) {
    if (nameChar[i] > 128) {
      try {
        pinyinName += PinyinHelper.toHanyuPinyinStringArray(
            nameChar[i], defaultFormat)[0].charAt(0);
      } catch (BadHanyuPinyinOutputFormatCombination e) {
        e.printStackTrace();
      }
    } else {
      pinyinName += nameChar[i];
    }
  }
  return pinyinName;
}

更多关于Java汉字转拼音pinyin4j用法请查看下面的相碰链接

(0)

相关推荐

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

    本文实例讲述了Java中汉字转拼音pinyin4j用法.分享给大家供大家参考,具体如下: 汉字转换拼音在日常开发中是个很常见的问题.例如我们伟大的12306,在地名中输入"WH",就会出现"武汉""芜湖""威海"等地名,输入"WUHU"就会出现"芜湖". Java获取汉字的拼音,pinyin4j这个库可以很好的解决这个问题. 下载地址:http://sourceforge.net/pro

  • java汉字转拼音工具类分享

    本文实例为大家分享了java汉字转拼音工具类的具体代码,供大家参考,具体内容如下 import com.google.common.base.Strings; import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat; import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;

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

    汉字转拼音类库Pinyin4j一般用法 pinyin4j的使用很方便,一般转换只需要使用PinyinHelper类的静态工具方法即可: String[] pinyin = PinyinHelper.toHanyuPinyinStringArray('刘'); //该类还有其他的拼音转换形式,但是基本上用不到,就不介绍了 返回的数组即是该字符的拼音,如上例就是pinyin[0]=liu2,后面的数字代表声调,声调为5表示轻读,无声调.之所谓返回数组,是因为被判定的汉字有可能有多个读音.如果输入的参

  • java实现汉字转拼音

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

  • Java汉字转拼音pinyin4j用法详解

    一.工具介绍 pinyin4j 是一个支持将简体和繁体中文转换到成拼音的Java开源类库: 1. 功能 支持同一汉字有多个发音 还支持拼音的格式化输出,比如第几声之类的, 同时支持简体中文.繁体中文转换为拼音-使用起来也非常简单.下面是其官方网址,其中提供了下载: pinyin4j的官方下载地址 2. 目录结构及说明 doc : pinyin4j的api文档 lib : pinyin4j的jar包 src: pinyin4j的源代码 CHANGELOG.txt : pinyin4j的版本更新日志

  • 浅谈java Iterator.remove()方法的用法(详解)

    实例如下: @Test public void tt(){ List<String> list = new ArrayList<String>(); list.add( "0" ); list.add( "1" ); list.add( "2" ); list.add( "3" ); list.add( "4" ); list.add( "5" ); list.a

  • Java map.getOrDefault()方法的用法详解

    Map.getOrDefault(Object key, V defaultValue)方法的作用是: 当Map集合中有这个key时,就使用这个key值: 如果没有就使用默认值defaultValue. 代码示例如下: HashMap<String, String> map = new HashMap<>(); map.put("name", "cookie"); map.put("age", "18"

  • Java Quartz触发器CronTriggerBean配置用法详解

    CronTrigger表达式分为七项子表达式,其中每一项以空格隔开,从左到右分别是:秒,分,时,月的某天,月,星期的某天,年:其中年不是必须的,也就是说任何一个表达式最少需要六项!  例:0 0 12 ? * WED 表示每个星期三的12点执行,这里没有"年"这项!  字段名(项)  必须  值范围  特殊字符  秒 是 0-59  , - * /   分 是 0-59  , - * /   时 是 0-23  , - * /   月的某天  是 1-31  , - * ? / L W

  • Java之Pattern.compile函数用法详解

    除了Pattern Pattern.compile(String regex), Pattern类的compile()方法还有另一个版本: Pattern Pattern.complie(String regex,int flag),它接受一个标记参数flag,以调整匹配的行为. flag来自以下Pattern类中的常量: 编译标记 效果 Pattern.CANON_EQ 两个字符当且仅当它们的完全规范分解相匹配时,就认为它们是匹配的,例如,如果我们指定这个标记,表达式a\u030A就会匹配字符

  • Java中ByteArrayInputStream和ByteArrayOutputStream用法详解

    目录 ByteArrayInputStream ByteArrayOutputStream ByteArrayInputStream 介绍ByteArrayInputStream 是字节数组输入流.它继承于 InputStream. InputStream 通过read()向外提供接口,供它们来读取字节数据:而 ByteArrayInputStream 的内部额外的定义了一个计数器,它被用来跟踪 read() 方法要读取的下一个字节. 它包含一个内部缓冲区,该缓冲区包含从流中读取的字节.也就是说

  • Java知识梳理之泛型用法详解

    目录 泛型 作用 集合中泛型 自定义泛型 通配符 2.注意点 3.有限制的通配符 泛型 背景: 从JDK 5.0以后,Java引入了“参数化类型(Parameterized type)”的概念,允许我们在创建集合时再指定集合元素的类型,正如:List ,这表明该List只能保存字符串类型的对象. 作用 解决元素存储的安全性问题,好比商品.药品标签,不会弄错. 解决获取数据元素时,需要类型强制转换的问题,好比不用每回拿商品.药品都要辨别. @Test public void test1(){ Ar

  • Java集合类之TreeSet的用法详解

    目录 上节回顾 TreeSet集合概述和特点 构造方法 方法摘要 Demo 自然排序Comparable的使用 比较器排序Comparator的使用 上节回顾 LinkedHashSet集合概述及特点 LinkedHashSet集合特点 哈希表和链表实现Set接口,具有可预测的迭代次序 由链表保证元素有序,也就是说元素的存储和取出顺序是一致的 由哈希表保证元素唯一,也就是说没有重复元素 LinkedHashSet集合的储存和遍历: import java.util.LinkedHashSet;

  • Java switch关键字原理及用法详解

    这篇文章主要介绍了Java中 switch关键原理及用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Switch语法 switch作为Java内置关键字,却在项目中真正使用的比较少.关于switch,还是有那么一些奥秘的. 要什么switch,我有if-else 确实,项目中使用switch比较少的一个主要原因就在于它的作用能被if-else代替,况且switch对类型的限制,也阻碍了switch的进一步使用. 先看看switch的语法

随机推荐