pinyin4j使用示例(支持多音字)

jopen 12年前發布 | 218K 次閱讀 Java開發 Pinyin4j

pinyin4j的主頁:http://pinyin4j.sourceforge.net/
pinyin4j能夠根據中文字符獲取其對應的拼音,而且拼音的格式可以定制。
pinyin4j是一個支持將中文轉換到拼音的Java開源類庫。

  1. 支持簡體中文和繁體中文字符;
  2. 支持轉換到漢語拼音,通用拼音, 威妥瑪拼音(威瑪拼法), 注音符號第二式, 耶魯拼法和國語羅馬字;
  3. 支持多音字,即可以獲取一個中文字符的多種發音;
  4. 支持多種字符串輸出格式,比如支持Unicode格式的字符ü和聲調符號(陰平 "ˉ",陽平"ˊ",上聲"ˇ",去聲"ˋ")的輸出。

示例代碼:

    public class Pinyin4jUtil {  

        /** 
         * 漢字轉換位漢語拼音首字母,英文字符不變,特殊字符丟失 支持多音字,生成方式如(長沙市長:cssc,zssz,zssc,cssz) 
         *  
         * @param chines 
         *            漢字 
         * @return 拼音 
         */  
        public static String converterToFirstSpell(String chines) {  
            StringBuffer pinyinName = new StringBuffer();  
            char[] nameChar = chines.toCharArray();  
            HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();  
            defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);  
            defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);  
            for (int i = 0; i < nameChar.length; i++) {  
                if (nameChar[i] > 128) {  
                    try {  
                        // 取得當前漢字的所有全拼  
                        String[] strs = PinyinHelper.toHanyuPinyinStringArray(  
                                nameChar[i], defaultFormat);  
                        if (strs != null) {  
                            for (int j = 0; j < strs.length; j++) {  
                                // 取首字母  
                                pinyinName.append(strs[j].charAt(0));  
                                if (j != strs.length - 1) {  
                                    pinyinName.append(",");  
                                }  
                            }  
                        }  
                        // else {  
                        // pinyinName.append(nameChar[i]);  
                        // }  
                    } catch (BadHanyuPinyinOutputFormatCombination e) {  
                        e.printStackTrace();  
                    }  
                } else {  
                    pinyinName.append(nameChar[i]);  
                }  
                pinyinName.append(" ");  
            }  
            // return pinyinName.toString();  
            return parseTheChineseByObject(discountTheChinese(pinyinName.toString()));  
        }  

        /** 
         * 漢字轉換位漢語全拼,英文字符不變,特殊字符丟失 
         * 支持多音字,生成方式如(重當參:zhongdangcen,zhongdangcan,chongdangcen 
         * ,chongdangshen,zhongdangshen,chongdangcan) 
         *  
         * @param chines 
         *            漢字 
         * @return 拼音 
         */  
        public static String converterToSpell(String chines) {  
            StringBuffer pinyinName = new StringBuffer();  
            char[] nameChar = chines.toCharArray();  
            HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();  
            defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);  
            defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);  
            for (int i = 0; i < nameChar.length; i++) {  
                if (nameChar[i] > 128) {  
                    try {  
                        // 取得當前漢字的所有全拼  
                        String[] strs = PinyinHelper.toHanyuPinyinStringArray(  
                                nameChar[i], defaultFormat);  
                        if (strs != null) {  
                            for (int j = 0; j < strs.length; j++) {  
                                pinyinName.append(strs[j]);  
                                if (j != strs.length - 1) {  
                                    pinyinName.append(",");  
                                }  
                            }  
                        }  
                    } catch (BadHanyuPinyinOutputFormatCombination e) {  
                        e.printStackTrace();  
                    }  
                } else {  
                    pinyinName.append(nameChar[i]);  
                }  
                pinyinName.append(" ");  
            }  
            // return pinyinName.toString();  
            return parseTheChineseByObject(discountTheChinese(pinyinName.toString()));  
        }  

        /** 
         * 去除多音字重復數據 
         *  
         * @param theStr 
         * @return 
         */  
        private static List<Map<String, Integer>> discountTheChinese(String theStr) {  
            // 去除重復拼音后的拼音列表  
            List<Map<String, Integer>> mapList = new ArrayList<Map<String, Integer>>();  
            // 用于處理每個字的多音字,去掉重復  
            Map<String, Integer> onlyOne = null;  
            String[] firsts = theStr.split(" ");  
            // 讀出每個漢字的拼音  
            for (String str : firsts) {  
                onlyOne = new Hashtable<String, Integer>();  
                String[] china = str.split(",");  
                // 多音字處理  
                for (String s : china) {  
                    Integer count = onlyOne.get(s);  
                    if (count == null) {  
                        onlyOne.put(s, new Integer(1));  
                    } else {  
                        onlyOne.remove(s);  
                        count++;  
                        onlyOne.put(s, count);  
                    }  
                }  
                mapList.add(onlyOne);  
            }  
            return mapList;  
        }  

        /** 
         * 解析并組合拼音,對象合并方案(推薦使用) 
         *  
         * @return 
         */  
        private static String parseTheChineseByObject(  
                List<Map<String, Integer>> list) {  
            Map<String, Integer> first = null; // 用于統計每一次,集合組合數據  
            // 遍歷每一組集合  
            for (int i = 0; i < list.size(); i++) {  
                // 每一組集合與上一次組合的Map  
                Map<String, Integer> temp = new Hashtable<String, Integer>();  
                // 第一次循環,first為空  
                if (first != null) {  
                    // 取出上次組合與此次集合的字符,并保存  
                    for (String s : first.keySet()) {  
                        for (String s1 : list.get(i).keySet()) {  
                            String str = s + s1;  
                            temp.put(str, 1);  
                        }  
                    }  
                    // 清理上一次組合數據  
                    if (temp != null && temp.size() > 0) {  
                        first.clear();  
                    }  
                } else {  
                    for (String s : list.get(i).keySet()) {  
                        String str = s;  
                        temp.put(str, 1);  
                    }  
                }  
                // 保存組合數據以便下次循環使用  
                if (temp != null && temp.size() > 0) {  
                    first = temp;  
                }  
            }  
            String returnStr = "";  
            if (first != null) {  
                // 遍歷取出組合字符串  
                for (String str : first.keySet()) {  
                    returnStr += (str + ",");  
                }  
            }  
            if (returnStr.length() > 0) {  
                returnStr = returnStr.substring(0, returnStr.length() - 1);  
            }  
            return returnStr;  
        }  

    }  

測試代碼

    String str = "長沙市長";  

            String pinyin = Pinyin4jUtil.converterToSpell(str);  
            System.out.println(str+" pin yin :"+pinyin);  

            pinyin = Pinyin4jUtil.converterToFirstSpell(str);  
            System.out.println(str+" short pin yin :"+pinyin);  

運行結果:

長沙市長 pin yin :zhangshashichang,changshashichang,zhangshashizhang,changshashizhang
長沙市長 short pin yin :cssc,zssz,zssc,cssz


參考:http://hi.baidu.com/stevenblake/item/fc3906eba5dc2bf0fa42ba0b


pinyin4j下載地址:http://sourceforge.net/projects/pinyin4j/files/latest/download?source=files

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!