Pinyin4j使用手册





Pinyin4j使用手册 
一般用法 
pinyin4j的使用很方便,一般转换只需要使用PinyinHelper类的静态工具方法即可: String[] pinyin = PinyinHelper.toHanyuPinyinStringArray(‘刘’); 
//该类还有其他的拼音转换形式,但是基本上用不到,就不介绍了 
返回的数组即是该字符的拼音,如上例就是pinyin[0]=liu2,后面的数字代表声调,声调为5表示轻读,无声调。之所谓返回数组,是因为被判定的汉字有可能有多个读音。如果输入的参数不是汉字,则返回null。  
拼音格式化 
如果对于拼音转换后的结果有一些特定的格式要求目前pinyin4j支持:  声调格式化。例如:“刘”字的格式化后为“liu2”或“liu”或“liú”  对特殊拼音ü的的显示格式。例如“u:”或“v”或“ü” 
 大小写的转换。例如:“liu2”或“LIU2” 
以上这些格式可以混合使用,下面就来介绍具体的使用方法,首先需要创建格式化对象HanyuPinyinOutputFormat,例如: 
HanyuPinyinOutputFormat outputFormat = new HanyuPinyinOutputFormat(); 然后分别调用outputFormat的set方法设置上述一些格式要求: 设置声调格式: 
outputFormat.setToneType(HanyuPinyinToneType);  
方法参数HanyuPinyinToneType有以下常量对象: 
HanyuPinyinToneType.WITH_TONE_NUMBER 用数字表示声调,例如:liu2 HanyuPinyinToneType.WITHOUT_TONE 无声调表示,例如:liu 
HanyuPinyinToneType.WITH_TONE_MARK 用声调符号表示,例如:liú 设置特殊拼音ü的显示格式: 
outputFormat.setVCharType(HanyuPinyinVCharType);  
方法参数HanyuPinyinVCharType有以下常量对象: 
HanyuPinyinVCharType.WITH_U_AND_COLON 以U和一个冒号表示该拼音,例如:lu: HanyuPinyinVCharType.WITH_V 以V表示该字符,例如:lv HanyuPinyinVCharType.WITH_U_UNICODE 以ü表示 








       var script = document.createElement('script'); script.src = 'http://static.pay.baidu.com/resource/baichuan/ns.js'; document.body.appendChild(script);    














设置大小写格式 
outputFormat.setCaseType(HanyuPinyinCaseType); 
HanyuPinyinCaseType.LOWERCASE 转换后以全小写方式输出 HanyuPinyinCaseType.UPPERCASE 转换后以全大写方式输出  
设置好格式对象后还是利用上述的工具类方法进行拼音转换,只不过需要将格式化对象当成方法参数传入转换方法,告知要转换的格式要求: 
String[] pinyin = PinyinHelper.toHanyuPinyinStringArray(‘刘’, outputFormat); 但该方法会有异常抛出,注意处理。  
示例 
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; import 
net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination; 
public class Test {  public static void main(String[] args) {   HanyuPinyinOutputFormat outputFormat = new 
HanyuPinyinOutputFormat(); 
  
outputFormat.setToneType(HanyuPinyinToneType.WITH_TONE_MARK); 
  outputFormat.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE);   outputFormat.setCaseType(HanyuPinyinCaseType.UPPERCASE);   try { 
  
 
System.out.println(concatPinyinStringArray(PinyinHelper.toHanyuPi
nyinStringArray('刘',outputFormat)));   } catch (BadHanyuPinyinOutputFormatCombination e) {    // TODO Auto-generated catch block    e.printStackTrace(); 
  } 
 }   
 
private static String concatPinyinStringArray(String[] pinyinArray) 
    { 
        StringBuffer pinyinStrBuf = new StringBuffer(); 
        if ((null != pinyinArray) && (pinyinArray.length > 0)) 


















        { 
            for (int i = 0; i < pinyinArray.length; i++)             { 
                pinyinStrBuf.append(pinyinArray[i]);                 
pinyinStrBuf.append(System.getProperty("line.separator"));             }         } 
        String outputString = pinyinStrBuf.toString();         return outputString;     } } 
输出结果为:LIÚ 
 
其他 
 PinyinHelper还有其他的静态方法,但示例和讲解中使用的方法是常见的拼音格式,因
此其他静态方法我没有调研其含义。 
 貌似支持生僻字,我试过很怪异的字,都可以将其读音拼写出来,因此这个工具包还是
很强的。










 PinYin4Objc 是一个流行的汉字(支持简体和繁体)转拼音的objc库,有以下特性:
 1.效率高,使用数据缓存,第一次初始化以后,拼音数据存入文件缓存和内存缓存,后面转换效率大大提高;
 2.支持自定义格式化,拼音大小写等等;
 3.拼音数据完整,支持中文简体和繁体,与网络上流行的相关项目比,数据很全,几乎没有出现转换错误的问题。
 
 PinYin4Objc is a popular objective-c library supporting convertion between Chinese(both Simplified and Tranditional) characters and most popular Pinyin systems, it's performance is very efficient, data cached at first time. The output format of pinyin could be customized.
 
 性能比较:
 与之前的pinyin,POAPinyin和PYMethod等项目比较,PinYin4Objc的速度是非常快的
 
 声调格式化。例如:“刘”字的格式化后为“liu2”或“liu”或“liú”
 
 对特殊拼音ü的的显示格式。例如“u:”或“v”或“ü”
 
 大小写的转换。例如:“liu2”或“LIU2”
 
 设置声调格式:
 outputFormat.setToneType(HanyuPinyinToneType);
 参数HanyuPinyinToneType有以下常量对象:
 
 HanyuPinyinToneType.WITH_TONE_NUMBER 用数字表示声调,例如:liu2
 
 HanyuPinyinToneType.WITHOUT_TONE 无声调表示,例如:liu
 
 HanyuPinyinToneType.WITH_TONE_MARK 用声调符号表示,例如:liú
 
 
 设置特殊拼音ü的显示格式:
 
 outputFormat.setVCharType(HanyuPinyinVCharType);
 
 参数HanyuPinyinVCharType有以下常量对象:
 
 HanyuPinyinVCharType.WITH_U_AND_COLON 以U和一个冒号表示该拼音,例如:lu:
 
 HanyuPinyinVCharType.WITH_V 以V表示该字符,例如:lv
 
 HanyuPinyinVCharType.WITH_U_UNICODE 以ü表示
 










  
  
  
  
 

Pinyin4j的基本用法

分类: Java Android   27003人阅读  评论(14)  收藏  举报
string null android class 文档 编程

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会返回null

                   if(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。

版权声明:本文为博主原创文章,未经博主允许不得转载。


你可能感兴趣的:(java,android)