转载自:

http://blog.csdn.net/pathuang68/article/details/6692882

1.     简单介绍

有时候,需要将汉字编程对应的拼音,以方便数据的处理。比如在Android手机应用的开发上,要查询联系人的姓名,通常都是用拼音进行查询的。比如要查询“曹孟德”,就可以输入“cmd”,即“曹孟德”三个汉字的拼音“caomengde”各字的首字母。但是怎样才能将“曹孟德”翻译成“caomengde”呢?很简单的办法就是建立一个大的对照表(比如用关联容器Map),比如<”曹”,”cao”>,<” 孟”,”meng”>,<” 德”,”de”>…但这样的做法,需要维护好一个比较大的对照表,同时一个汉字可能有多个发音,也就是说Map这样的容器时不行的,因为其<key,value>必须是一一对应的。在C++中可以用STL里面的multimap来解决这个问题,但Java中没有类似multimap这样的东西,除非自己实现一个。

Pinyin4j就是为了解决类似这样的问题的。它是sourceforge.net上的一个开源项目,功能非常强大:

+ 支持同一汉字有多个发音

+ 还支持拼音的格式化输出,比如第几声之类的,

+ 同时支持简体中文、繁体中文转换为拼音…使用起来也非常简单。下面是其官方网址,其中提供了下载:

http://pinyin4j.sourceforge.net/

2.     基本用法:

通常情况下,只需要用到其中的PinyinHelper类中的静态方法toHanyuPinyinStringArray就可以了,比如:

String[] pinyinArray =PinyinHelper.toHanyuPinyinStringArray('单');
for(int i = 0; i < pinyinArray.length; ++i)
{System.out.println(pinyinArray[i]);
}

就会输出:

dan1

chan2

shan4

这三种发音,后面的数字代表第几声。可以看到静态方法toHanyuPinyinStringArray返回的数据类型是一个String数组,它用来接收一个汉字的多个发音,如果toHanyuPinyinStringArray中的参数不是汉字,那么它会返回null。

3.    格式支持

Pinyin4j支持拼音输出的格式化,比如,“黄”可以输出为“huang”、“huang2”、“huáng”等等,下面的代码就似是输出“huáng”的示例:

HanyuPinyinOutputFormat format= new HanyuPinyinOutputFormat();
format.setToneType(HanyuPinyinToneType.WITH_TONE_MARK);
format.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE);String[] pinyinArray = null;try
{pinyinArray = PinyinHelper.toHanyuPinyinStringArray('黄', format);
}
catch(BadHanyuPinyinOutputFormatCombination e)
{e.printStackTrace();
}
for(int i = 0; i < pinyinArray.length; ++i)
{System.out.println(pinyinArray[i]);
}

此外,还支持大小写转换、ü等等。详细情况,可以查看Pinyin4j自带的文档。

4.    实际示例代码

如果我们要将一段文字中的汉字全部转换成不带音调的拼音输出,而这段文字中又可能包含阿拉伯数字、英文、标点符号等等。如果完全靠自己写代码进行转换,那是非常麻烦的,其中一个首先就要区别,这段文字中那些是汉字,那些是非汉字。有了Pinyin4j,这个问题就不再困难了,因为对于非汉字,Pinyin4j会自动输出null。参考下面的示例代码:

importnet.sourceforge.pinyin4j.*;
importnet.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
importnet.sourceforge.pinyin4j.format.HanyuPinyinToneType;
importnet.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;public class Chinese2PY
{public static void main(String[] args){        Hanyu hanyu = new Hanyu();// 中英文混合的一段文字String str = "荆溪白石出,Hello 天寒红叶稀。Android 山路元无雨,What's up?   空翠湿人衣。";String strPinyin = hanyu.getStringPinYin(str);System.out.println(strPinyin);}
}class Hanyu
{private HanyuPinyinOutputFormat format = null;private String[] pinyin;public Hanyu(){format = new HanyuPinyinOutputFormat();format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);pinyin = null;}//转换单个字符public String getCharacterPinYin(char c){try{pinyin = PinyinHelper.toHanyuPinyinStringArray(c, format);    } catch(BadHanyuPinyinOutputFormatCombination e){e.printStackTrace();}  // 如果c不是汉字,toHanyuPinyinStringArray会返回nullif(pinyin == null) return null;// 只取一个发音,如果是多音字,仅取第一个发音return pinyin[0];   }//转换一个字符串public String getStringPinYin(String str){StringBuilder sb = new StringBuilder();String tempPinyin = null;for(int i = 0; i < str.length(); ++i){tempPinyin =getCharacterPinYin(str.charAt(i));if(tempPinyin == null){// 如果str.charAt(i)非汉字,则保持原样sb.append(str.charAt(i));}else{sb.append(tempPinyin);}}return sb.toString();}
}

输出结果:

jingxibaishichu,Hellotianhanhongyexi。Android shanluyuanwuyu,What'sup?   kongcuishirenyi。

Pinyin4j 详解及使用相关推荐

  1. 从命令行到IDE,版本管理工具Git详解(远程仓库创建+命令行讲解+IDEA集成使用)

    首先,Git已经并不只是GitHub,而是所有基于Git的平台,只要在你的电脑上面下载了Git,你就可以通过Git去管理"基于Git的平台"上的代码,常用的平台有GitHub.Gi ...

  2. JVM年轻代,老年代,永久代详解​​​​​​​

    秉承不重复造轮子的原则,查看印象笔记分享连接↓↓↓↓ 传送门:JVM年轻代,老年代,永久代详解 速读摘要 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.在 ...

  3. docker常用命令详解

    docker常用命令详解 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备忘记录下来. 根据自己的理解,总的来说分为以下几种: Doc ...

  4. 通俗易懂word2vec详解词嵌入-深度学习

    https://blog.csdn.net/just_so_so_fnc/article/details/103304995 skip-gram 原理没看完 https://blog.csdn.net ...

  5. 深度学习优化函数详解(5)-- Nesterov accelerated gradient (NAG) 优化算法

    深度学习优化函数详解系列目录 深度学习优化函数详解(0)– 线性回归问题 深度学习优化函数详解(1)– Gradient Descent 梯度下降法 深度学习优化函数详解(2)– SGD 随机梯度下降 ...

  6. CUDA之nvidia-smi命令详解---gpu

    nvidia-smi是用来查看GPU使用情况的.我常用这个命令判断哪几块GPU空闲,但是最近的GPU使用状态让我很困惑,于是把nvidia-smi命令显示的GPU使用表中各个内容的具体含义解释一下. ...

  7. Bert代码详解(一)重点详细

    这是bert的pytorch版本(与tensorflow一样的,这个更简单些,这个看懂了,tf也能看懂),地址:https://github.com/huggingface/pytorch-pretr ...

  8. CRF(条件随机场)与Viterbi(维特比)算法原理详解

    摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...

  9. pytorch nn.LSTM()参数详解

    输入数据格式: input(seq_len, batch, input_size) h0(num_layers * num_directions, batch, hidden_size) c0(num ...

最新文章

  1. windows CPU性能监控命令
  2. 如何回答十个最棘手的面试问题(下)
  3. linux 流量 脚本,linux 检测网络出入流量 当达到一定量时 自动执行另一个脚本。...
  4. java Calendar
  5. codeforces734E
  6. 最难游戏2计算机5关,最囧游戏2第5关通关攻略
  7. 网络数据包的抓包(解析数据包内容)
  8. 项目中的“里程碑”就是我们常说的里程碑吗?
  9. 苹果前置摄像头拍出来是反的怎么调_iPhone 前镜头自拍会左右颠倒?如何开启前镜头镜像翻转设定...
  10. 游戏攻略 一 天堂W(韩)
  11. 【BZOJ】P4238 电压
  12. 2022年广西医院三基考试中医学综合训练题及答案
  13. 毛星云Opencv之9.5模板匹配及其实现代码
  14. 程序员面试闪充--iOS密码学
  15. APICloud数据云3.0使用教程
  16. 学科实践活动感悟50字_社会实践活动的自我评价50字
  17. 2019数博会参会嘉宾数量、层级、范围创历届新高,全球领袖级企业竞相亮相
  18. 读书笔记006:《伤寒论》- 足太阴脾经
  19. Mathematica和Wolfram语言面向数学的入门指南:三角函数
  20. ERDAS IMAGINE 9.2进行遥感影像融合

热门文章

  1. 不同类型怎么选择服务器
  2. 六派巨量转移技术概述
  3. js网页点击播放背景音乐,再次点击暂停播放背景音乐
  4. esxi能直通的显卡型号_七彩虹RTX SUPER祝融(火神)版显卡上手体验
  5. Qt之自定义属性Q_PROPERTY
  6. 利用时间字符串计算时间差
  7. TestNG数据驱动
  8. Python 基础知识自检,你离深入掌握 Python 还有多远
  9. 解决java.lang.IllegalArgumentException
  10. FPGA-Vivado