Pinyin 4 jの詳細と使用


転載先:
http://blog.csdn.net/pathuang68/article/details/6692882
1.     簡単な紹介
データの処理を容易にするために、漢字を対応するピンインをプログラミングする必要がある場合があります.例えばAndroidの携帯電話アプリの開発では、連絡先の名前を調べるには、ピンインで調べるのが一般的です.例えば「曹孟徳」を検索するには、「cmd」、すなわち「曹孟徳」の3つの漢字のピンイン「caomengde」の各字の頭文字を入力することができます.しかし、「曹孟徳」を「caomengde」に訳すにはどうすればいいのだろうか.簡単な方法は、大きな対照表(例えば、関連容器Map)を構築することです.例えば、「曹」、「cao」>「孟」、「meng」>「徳」、「de」>...しかし、このようなやり方では、比較的大きな対照表を維持する必要があります.同時に、1つの漢字が複数の発音を持つことができます.つまり、Mapのような容器ではだめです.value>は一つ一つ対応しなければなりません.C++ではSTLの中のmultimapでこの問題を解決できますが、Javaにはmultimapのようなものはありません.自分で実現しない限り.
Pinyin 4 jはこのような問題を解決するためです.これはsourceforge.net上のオープンソースプロジェクトで、非常に強力です.
+同じ漢字の複数の発音をサポート
+ピンインのフォーマット出力もサポートされています.
+簡体字中国語、繁体字中国語のピンインへの変換もサポート...使用も簡単です.以下は公式のWebサイトで、ダウンロードが提供されています.
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
この3つの発音は、後ろの数字が何番目の音を表しています.静的メソッドtoHanyuPinyinStringArrayが返すデータ型はString配列であり、1つの漢字の複数の発音を受信するために使用され、toHanyuPinyinStringArrayのパラメータが漢字でない場合nullが返されます.
3.    フォーマットのサポート
Pinyin 4 jはピンイン出力のフォーマットをサポートしています.例えば、「黄」は「huang」、「huang 2」、「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]);
}

また、大文字と小文字の変換、üなどもサポートされています.詳細については、Pinyin 4 jが持参したドキュメントを参照してください.
4.    実績サンプル・コード
ある文字の漢字をすべて音調のないピンイン出力に変換する場合、アラビア数字、英語、句読点などが含まれる可能性があります.もし完全に自分でコードを書いて変換するならば、それはとても面倒で、その中の1つはまず区別して、この文字の中であれらは漢字で、あれらは非漢字です.Pinyin 4 jがあれば、この問題は難しくありません.非漢字の場合、Pinyin 4 jは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.