java實現漢字轉拼音
個人部落格站已經上線了,網址 www.llwjy.com ~歡迎各位吐槽~
-------------------------------------------------------------------------------------------------
一、問題描述
漢字轉化為對應的拼音或者獲取漢字拼音的首字母,這些都是在開發中經常遇到的問題,在獲取漢字的拼音或者拼音的首字母之後,我們在推薦或者搜尋部門可以很大程度提高使用者的體驗,比如使用者輸入“NH”,我們就可以聯想出“你好”、“你會”、“年後”、“內涵”等詞語。在Java中,pinyin4j.jar這個工具很好實現了將漢字轉化為對應的拼音,下面我們就介紹下如何使用這個jar包。
二、資源下載
下載地址點選這裡,下載之後解壓,直接使用檔案中的pinyin4j-2.5.0.jar即可。
三、提供方法
我們可以使用HanyuPinyinOutputFormat類來設定拼音的返回方式,比如設定拼音的大小寫、音標方式以及拼音ü的顯示形式,具體如下圖:
直接使用PinyinHelper中的方法來對漢字做對應的轉化,具體有如下三種,三種效果如何自己做下測試即可:
四、編寫程式碼
針對我們平常可能用到的功能,我做了如下的封裝,提供的功能還有具體的實現步驟參照程式碼中的註釋:
/** *@Description: 將漢語轉化為拼音 */ package com.lulei.util; import java.util.ArrayList; import java.util.List; 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; public class PinYinUtil { private static HanyuPinyinOutputFormat format = null; static { format = new HanyuPinyinOutputFormat(); //拼音小寫 format.setCaseType(HanyuPinyinCaseType.LOWERCASE); //無音標方式;WITH_TONE_NUMBER:1-4數字表示英標;WITH_TONE_MARK:直接用音標符(必須WITH_U_UNICODE否則異常 format.setToneType(HanyuPinyinToneType.WITHOUT_TONE); //用v表示ü format.setVCharType(HanyuPinyinVCharType.WITH_V); } /** * @param str * @return * @Author:lulei * @Description: 返回字串的拼音 */ public static String[] getCharPinYinString(String str) { if (str == null || str.length() < 1) { return null; } List<String> result = new ArrayList<String>(); //對字串中的記錄逐個分析 for (int i = 0; i < str.length(); i++) { result = getCharPinYinString(str.charAt(i), result); } return result.toArray(new String[result.size()]); } /** * @param c * @param list * @return * @Author:lulei * @Description: 將字元c的拼音拼接到list中的記錄中 */ private static List<String> getCharPinYinString(char c, List<String> list) { String[] strs = getCharPinYinString(c); List<String> result = new ArrayList<String>(); //如果解析出的拼音為空,判斷字元C是否為英文字母,如果是英文字母則新增值拼音結果中 if (strs == null) { if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { c = c <= 91 ? (char)(c + 32) : c; if (list == null || list.size() == 0) { result.add(c + ""); } else { for (String s : list) { result.add(s + c); } } return result; } return list; } //將字元C的拼音首和已存在的拼音首組合成新的記錄 for (String str : strs) { if (list == null || list.size() == 0) { result.add(str); } else { for (String s : list) { result.add(s + str); } } } return result; } /** * @param c * @return * @Author:lulei * @Description: 返回漢字的拼音 */ public static String[] getCharPinYinString(char c) { try { //返回字元C的拼音 return PinyinHelper.toHanyuPinyinStringArray(c, format); } catch (Exception e) { e.printStackTrace(); } return null; } /** * @param str * @return * @Author:lulei * @Description: 返回字串的拼音的首字母 */ public static String[] getCharPinYinChar(String str) { if (str == null || str.length() < 1) { return null; } List<String> result = new ArrayList<String>(); //對字串中的記錄逐個分析 for (int i = 0; i < str.length(); i++) { result = getCharPinYinChar(str.charAt(i), result); } return result.toArray(new String[result.size()]); } /** * @param c * @param list * @return * @Author:lulei * @Description: 將字元c的拼音首字母拼接到list中的記錄中 */ private static List<String> getCharPinYinChar(char c, List<String> list) { char[] chars = getCharPinYinChar(c); List<String> result = new ArrayList<String>(); //如果解析出的拼音為空,判斷字元C是否為英文字母,如果是英文字母則新增值拼音結果中 if (chars == null) { if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { c = c < 91 ? (char)(c + 32) : c; if (list == null || list.size() == 0) { result.add(c + ""); } else { for (String s : list) { result.add(s + c); } } return result; } return list; } //將字元C的拼音首字母和已存在的拼音首字母組合成新的記錄 for (char ch : chars) { if (list == null || list.size() == 0) { result.add(ch + ""); } else { for (String s : list) { result.add(s + ch); } } } return result; } /** * @param c * @return * @Author:lulei * @Description:返回漢字拼音首字母 */ public static char[] getCharPinYinChar(char c) { //字元C的拼音 String[] strs = getCharPinYinString(c); if (strs != null) { //擷取拼音的首字母 char[] chars = new char[strs.length]; for(int i = 0; i <chars.length; i++) { chars[i] = strs[i].charAt(0); } return chars; } return null; } public static void main(String[] args) { // TODO Auto-generated method stub char c = "重慶".charAt(0); String[] str = PinYinUtil.getCharPinYinString(c); for(String s : str) { System.out.println(s); } char[] chars = PinYinUtil.getCharPinYinChar(c); for(char c1 : chars) { System.out.println(c1); } str = PinYinUtil.getCharPinYinString("重慶c"); for(String s : str) { System.out.println(s); } str = PinYinUtil.getCharPinYinChar("重慶a"); for(String s : str) { System.out.println(s); } } }
五、輸出結果
-------------------------------------------------------------------------------------------------
小福利
-------------------------------------------------------------------------------------------------
個人在極客學院上《Lucene案例開發》課程已經上線了(目前上線到第二課),歡迎大家吐槽~