首页 > 代码库 > java 中文转拼音之pinyin4j

java 中文转拼音之pinyin4j

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


Pinyin4j就是为了解决类似这样的问题的。它是sourceforge.net上的一个开源项目,功能非常强大:
+ 支持同一汉字有多个发音
+ 还支持拼音的格式化输出,比如第几声之类的,
+ 同时支持简体中文、繁体中文转换为拼音…使用起来也非常简单。


pinyin4j的官方下载地址http://sourceforge.net/projects/pinyin4j/files/,目前最新的版本是2.5.0
下载解压后的目录结构及说明如下
(1)     doc : pinyin4j的api文档
(2)     lib : pinyin4j的jar包
(3)     src : pinyin4j的源代码
(4)     CHANGELOG.txt : pinyin4j的版本更新日志
(5)     COPYING.txt : LICENSE说明
(6)     README.txt : pinyin4j的概要介绍


二、局限性:
虽然pinyin4j很好用,但是还是有局限的。以下代码只能获取单个汉字的拼音,但是不能获取一个包含多音字的词的拼音。
例如“重庆”,无法判断到底是“chongqing”还是“zhongqing”,pinyin4j不能通过上下文来判断多音字的读音。
所以,在获取一个包含多音字的词语的读音,可以返回一个列表,正确的读音只能是人工判断选择。


三、格式控制:
HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();   
  
// UPPERCASE:大写  (ZHONG)  
// LOWERCASE:小写  (zhong)  
format.setCaseType(HanyuPinyinCaseType.LOWERCASE);  
  
// WITHOUT_TONE:无音标  (zhong)  
// WITH_TONE_NUMBER:1-4数字表示英标  (zhong4)  
// WITH_TONE_MARK:直接用音标符(必须WITH_U_UNICODE否则异常)  (zhòng)  
format.setToneType(HanyuPinyinToneType.WITH_TONE_MARK);  
  
// WITH_V:用v表示ü  (nv)  
// WITH_U_AND_COLON:用"u:"表示ü  (nu:)  
// WITH_U_UNICODE:直接用ü (nü)  
format.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE);  
          
String[] pinyin = PinyinHelper.toHanyuPinyinStringArray(‘重‘, format); 


四、代码


public class PinYin4JTest {

 public static String getPinYin(String inputString) {  
          
       HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();  
       format.setCaseType(HanyuPinyinCaseType.LOWERCASE);  
       format.setToneType(HanyuPinyinToneType.WITH_TONE_NUMBER);  
       format.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE);  
 
       char[] input = inputString.trim().toCharArray();  
       StringBuffer output = new StringBuffer("");  
 
       try {  
           for (int i = 0; i < input.length; i++) {  
               if (Character.toString(input[i]).matches("[\\u4E00-\\u9FA5]+")) {  
                   String[] temp = PinyinHelper.toHanyuPinyinStringArray(input[i], format);  
                   output.append(temp[0]);  
                   output.append(" ");  
               } else  
                   output.append(Character.toString(input[i]));  
           }  
       } catch (BadHanyuPinyinOutputFormatCombination e) {  
           e.printStackTrace();  
       }  
       return output.toString();  
   } 


/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(getPinYin("中华人民共和国"));
}


}


注:pinyin4j支持多种拼音方式
Hanyu Pinyin 汉语拼音
Tongyong Pinyin 通用拼音
Wade-Giles 威妥玛拼音
MPS2 (Mandarin Phonetic Symbols II) 国语注音符号第二式
Yale Romanization 耶鲁罗马化拼音
Gwoyeu Romatzyh国语国语罗马化拼音
    各种拼音说明
        Yale Pinyin是在第二次世界大战期间由美国军方发明的编码系统,主要为了让在中国地区作战的美军士兵能够快速地熟悉汉语发音,
能够向当地人请求帮助,可以说这是一个速成教材,它的目的甚至不是用来互相交流而是使士兵在发音时不会被中国人听错就可以了。
        Gwoyeu Romatzyh:即国语罗马字,它是由林语堂提议建立的,在1928年由国民政府大学堂颁布推行。在中国的台湾省这一编码体系得到了保留,
但是它就像 Yale一样现在几乎很少有人使用,在1986年,国语罗马字被国语注音符号第二式(MPSII)所取代,
在2002年,又被通用拼音(Tongyong Pinyin)取代,成为台湾今天正式的官方汉语音译编码体系。
        威妥玛拼音,习惯称作威妥玛拼法或威玛式拼音、韦氏拼音、威翟式拼音,是一套用于拼写中文普通话的罗马拼音系统。
19世纪中叶由英国人威妥玛(Thomas Francis Wade)发明,后由翟理斯(Herbert Allen Giles)完成修订,并编入其所撰写的汉英字典。