1. 程式人生 > >pinyin4j獲取漢字正確的全拼和簡拼(解決多音字問題)

pinyin4j獲取漢字正確的全拼和簡拼(解決多音字問題)

需要獲取漢字的拼音然後根據拼音來實現快速搜尋。Java方面有PinYin4j開源專案獲取漢字的拼音,但是對多音字處理的不好,自己研究了一下,終於給解決了。在這裡跟大家分享一下!

工程目錄結構如下

1363751457_9088.png

原理:將可能出現的多音字 片語組合起來,用正確拼音當作其key,片語當作value,儲存到一個Map集合中。使用PinYin4j獲取漢字拼音時判斷是否為多音字(返回陣列的 長度大於1),如果為多音字,用其拼音去 Map集合中查詢,若有則取當前拼音為正確拼音。若到最後都沒有找到,給其一個預設的拼音。

duoyinzi_dic.txt

 
a#阿 阿姨 阿富 阿門 阿拉 阿林  黑阿  麥阿密 鹿城阿嶴 阿福  
ao#拗口 違拗 凹  
ai#艾 艾滋 艾蒿 未艾  
bang#膀 翅膀 臂膀 重磅 磅秤 黃泥磅店 蛤蚌 蚌殼 河蚌 鷸蚌 珠蚌 蚌  
ba#扒  
bai#叔伯 百 百萬  柏  
bao#剝皮 薄 超薄 薄脆 薄板 薄餅  暴 暴晒 暴發 暴雨 暴力 風暴  暴露 暴風  漢堡 古堡 地堡 城堡 龍堡 卡斯堡  麻家堡 麥芬堡 漢堡 麥得堡  麥爾堡  曝光 瀑河  
beng#蚌埠  
bi#復辟  臂 臂章 螳臂 交臂 前臂 一臂 奮臂 膀臂 臂膀 祕魯 泌陽  
bing#屏棄 屏氣 屏除 屏退 屏息  
bian#扁 扁桃 便 方便 方便麵 便當 便捷  
bo#薄 薄荷 單薄 伯 伯仲 伯樂 伯勞 伯父 大伯 老伯 伯母 黃伯 伯爵 停泊 淡泊 尼泊 漂泊 波 鴻波 柏林  
bu#大埔  
can#參 參謀 參事 總參 引數 參議 參觀 參拜 參股  
cang#藏 埋藏 藏頭 祕藏  雪藏 藏匿 收藏 館藏 礦藏 隱藏  蘊藏 藏袍 儲藏 窖藏 藏龍  藏胞 冷藏 珍藏 私藏 藏掖 西藏 藏書 藏品 傖俗  傖 龍藏寺  
cen#參差  
ceng#曾 不曾 似曾 幾曾 何曾 曾經 曾幾 未曾 噌  噌的 一聲  
cha#差  剎那 寶剎 一剎  喳喳  
chai#公差 差役 專差 官差 聽差 美差 辦差 差事 差使 肥差 當差 欽差  
chan#顫 顫悠  單于 禪 禪學 班禪 禪宗 禪堂 禪門 禪機 禪杖 禪房 禪師 坐禪 參禪 禪院  
chang#長 周長 細長 長髮 三長 長河 長袖 長衫 天長 長短 超長 長沙 長春 長遠 長度 長江 長處 長假  長街 長征 全長 長城 波長  身長 長途 長吁 長虹 長方  廠  
chao#朝 朝陽 朝陽區 朝鮮 朝廷 王朝 歷朝 解嘲 譏嘲 自嘲 嘲笑 嘲弄 冷嘲 嘲諷 綽綽 綽起 綽家 剿襲 剿說  
che#車 汽車 停車場 車車  黑車 車飾  
chen#稱職 勻稱 稱心 相稱 對稱  
cheng#稱 職稱 簡稱 總稱 官稱 代稱 稱號 稱謂  暱稱 謙稱 全稱 名稱  乘 噌吰 澄  
chu#六畜 家畜 耕畜 畜生 牲畜  
chui#椎心  
chuan#傳 文傳 傳媒 傳銷 傳情 真傳 祖傳 傳聞 傳家 祕傳 傳單 傳說  
chi#匙子 茶匙 羹匙 湯匙 尺 尺度 英尺 咫尺 尺碼 公尺 卡尺 米尺 捲尺  
chong#重慶 重重  
chou#臭 汗臭 臭氧 口臭 腋臭 臭蟲 臭罵 臭美 酸臭 腐臭 臭氣 腥臭 臭名 遺臭 惡臭 臭豆 狐臭 臭味 臭架  
chuang#經幢  
chuo#綽 綽約 闊綽 綽號 寬綽  
ci#參差 伺候 龜茲  
cuan#攢錢 攢聚 攢動   
cuo#撮兒 撮要 撮合  
da#大 大街 沓子 龍大 大西洋 大昌  大聖 福大 黑大 大華 大包  大廈  
dao#叨 叨嘮 絮叨 叨唸 叨咕 唸叨 嘮叨 叨叨 磨叨  
dai#大夫  
dan#單 西單 東單 清單 報單 單利 名單 單姓 單親 單線 單科 單間 單挑 單價 單詞  子彈    
de#的 似的 總的 中的 別的  
deng#澄清  
di#怎的 無的 有的 目的 標的 打的 的確 的當 的士 上地 大地 天地 提防 堤  
diao#調 藍調 藍調吧 調調 音調 論調 格調 調令 低調 筆調 基調 強調 聲調 濫調 老調 色調 單調 腔調 跑調 曲調 步調 語調 主調 情調  
du#都 都會 國都 都城 古都 故都 大都 首都 成都 舊都 都市 龍都  鼎都 鶴都 鵬都 鴻都  麥度 度 態度 讀書 法度 寬度 進度   
dui#堆    
dou#全都 句讀  
duo#測度 忖度 揣度 猜度 舵  
dun#糧囤 頓  
e#阿諛 阿膠 阿彌 噁心  
er#兒  
fan#番 番茄 繁  
fo#佛 佛塔 佛徒 佛牙 佛教  
fu#彷彿 果脯  
fou#否 是否 與否  
ga#咖 咖哩 伽馬  
gai#蓋  
gang#扛鼎  
ge#革 革命  皮革  鷹革  蛤蚧 文蛤 蛤蜊 咯吱 咯噔 咯咯  
gei#給  
geng#脖頸  
gong#女紅  
gu#谷 布穀 穀物 谷地 矽谷 中鵠  麥谷 麓谷 鷺谷 鼓  
gui#龜 龜山 龜士 龜博 龜仔 鹿龜  龜汁 龜苓 龜頂  
gua#挺括 頂呱 呱呱 呱唧 呱嗒 呱  
guan#綸巾 東莞  
guang#廣 廣州 廣東 廣播  
ha#蛤蟆 癩蛤 蝦蟆  
hai#還是 還有 咳  
hao#貉子 貉絨  
hang#總行 分行 支行 行業 排行 行情 央行 商行 外行 銀行 商行 酒行 麻行 琴行 巷道 珩  
he#和 嘉和 和睦 親和  龍和  之貉 威嚇 恫嚇 恐嚇 鼎和  錦和 麒和苑 合 合資 鴻合  
heng#道行  
hu#鵠 鵠望 鴻鵠 鵠立  
huan#還 鸝還  
hui#會 會館 會展 會所 協會 國會 會堂  
hong#紅 紅裝 紅牌  紅木 紅人 虹  
huo#軟和 熱和 暖和  
ji#病革 給養 自給 給水 薪給 給予 供給 稽考 稽查 稽核 滑稽 稽留 緝獲 緝查 緝私 緝捕 狼藉 奇數 亟  亟待 亟須 亟亟 亟需 詰屈 薺菜  
jia#雪茄 伽  瑜伽 伽利略 家  
jian#見 龍見  
jiang#降 降溫 降低 降旗 下降 倔強  
jiao#嚼舌 嚼子 細嚼 角 平角 視角 海角 龍角 鹿角  圍剿 征剿 餃 餃子 腳  
jie#解 解放 慰藉 蘊藉 盤詰 詰難 詰問 反詰 桔  
jin#矜 矜誇 矜持 驕矜 自矜 勁  
jing#頸 頸項 頸椎 引頸 長頸 宮頸 瓶頸 龍頸  黑頸鶴 鹿頸  景 景色 帝景 勁鬆  
ju#咀 咀嚼  居  桔汁  
jun#均 平均 鴻均  
juan#棚圈 圈養  
jv#咀嚼 趑趄  
jvan#豬圈 羊圈  
jue#主角 角色 旦角 女角 丑角 角力 名角 配角 咀嚼 覺 直覺 感覺 錯覺 觸覺 幻覺 堀  
jun#龜裂 俊  
jvn#龜裂  
ka#咖啡 卡 磁卡  賀卡 卡拉 胸卡 音效卡 卡片  綠卡 卡通  網絡卡 卡口  龍卡  咯痰 咯血 喀  
kang#扛  
ke#咳 咳嗽 乾咳 貝殼 蚌殼 外殼 蛋殼 腦殼 彈殼  
keng#吭聲 吭氣 吭哧  
kuai#會計 財會  
kuo#括  
la#癩痢 臘  
lai#癩瘡 癩子 癩蛤 癩皮  
lao#積潦 絡子 落枕 落價 麻粩  
le#樂 娛樂 玩樂 樂趣  美樂 樂緣  勒  了  
lei#勒緊  
lo#然咯  
lou#佝僂  
long#里弄 弄堂 瀧  
li#禮 豊 櫟  
liao#瞭解 了結  明瞭 了得 末了 未了 瞭如  瞭如指掌 潦草 潦倒  
liang#靚  
liu#碌碡  碌碌 勞碌 忙碌 庸碌 六  
lu#綠林 碌  
luo#絡 絡腮 落 部落 落花 日落  
lv#率 頻率 機率 比率 效率 勝率 概率 匯率 功率 倍率 綠 綠葉 淡綠 綠色 綠豆 傴僂  綠洲  
lun#丙綸 錦綸 經綸 滌綸  
mai#埋  
man#埋怨 蔓  
mai#脈 山脈 動脈 命脈 筋脈 脈象 氣脈 脈動 脈息 脈絡 一脈 經脈  
mang#氓 流氓  
me#黛麼  
meng#群氓 盟  
mei#沒  
mo#埋沒 隱沒 脈脈 模 航模 模糊 男模 楷模 規模 勞模 模型 模範 模特 名模  摩 麼 麼 麼  
mou#綢繆  
mi#祕 祕密 祕方 奧祕 神祕 泌尿 分泌  
miu#謬 謬論 紕繆  
mu#人模 字模 模板 模樣 模具 裝模 裝模做樣 模子  
na#哪 娜 安娜 娜娜 麗娜 黛爾娜 黛娜  海娜 黑娜 黃麗娜 麥香娜  優娜 麥娜 麟娜  那  
nan#南 南方 湖南  
ne#哪吒 呢  
nong#弄  
ni#毛呢 花呢 呢絨 線呢 呢料 呢子 呢喃 溺  
niao#便溺 尿  
nian#粘  
niu#執拗 拗不  
nue#瘧 瘧疾  
nuo#婀娜 嫋娜  
nv#女 女人  
nve#瘧原 瘧蚊  
pa#扒  
pai#迫擊 迫擊炮 派  
pao#刨 炮  
pang#膀胱 膀腫 磅礴  
pi#否極 臧否 龍陂 黃陂  
pian#扁舟 便宜  
piao#樸姓  
ping#屏  螢幕 熒屏 銀屏  
po#泊 迫 朴刀 坡 陂  
pu#暴十 一曝十寒 裡堡 十里堡 胸脯 肉脯 脯子 杏脯 簡樸 樸質 古樸 樸厚 純樸 樸素 誠樸 儉樸 樸實 淳樸 曝晒 瀑布 飛瀑 埔 黃埔  
qiu#龜茲  
qi#稽首 緝鞋 棲 奇 奇妙 傳奇 亟來 荸薺 蹊蹺  林棲  鹿奇 鷺奇 漆 齊 齊天大聖 齊天 其  
qia#卡脖 卡子 關卡 卡殼 哨卡 邊卡 髮卡  
qiao#雀盲 雀子 地殼 甲殼 軀殼  
qian#纖手 拉縴 縴夫 纖繩 乾  
qiang#強顏  強人 自強 強烈 強風 強大 黎強 麒強 鶴強 龔強  
qie#茄子 顛茄 番茄 趔趄   
qin#親 親和 親親 棘矜 矜鋤  
qing#乾親 親家 黥  
qu#區 小區  
quan#轉圈 鋼圈 圓圈 羅圈 弧圈 墊圈 小圈 眼圈  
que#雀 麻雀 鳥雀 燕雀 孔雀 雲雀 雀巢、  
re#般若  
ruo#若  
sai#塞 麥迪塞姆 活塞  
se#堵塞 搪塞 茅塞 閉塞 鼻塞 梗塞 阻塞 淤塞 擁塞 哽塞 月色 彩色 特色 深色 聲色 黛色  黛色 黑色瞳 色坊  
sha#剎車 急剎 急剎車 廈  廣廈 大廈 商廈 鷹大廈  莎  
shai#色子  
shan#姓單 單縣  杉 鐵杉 杉樹 封禪 禪讓 黒杉  柵  
shang#裳 衣裳  
she#拾級 折本  
shen#沙蔘 野參 參王 人蔘 紅參 丹蔘 山參 海蔘 刺蔘 沒什 什麼 為什 鹿參 身  
sheng#野乘 千乘 史乘  省 晟 盛 盛大 鴻盛  
shi#鑰匙 拾荒 撿拾 拾物 傢什 什物 什錦 麻什  麥什 喀什 牛什  識  見識 知識 似的 骨殖 食 飲食 副食  石 石業 石頭 石藝 氏 姓氏 上柵 下柵  
shuai#表率 率性 率直 率真 粗率 率領 輕率 直率 草率 大率 坦率 數字 招數 基數 數碼  
shuang#瀧水  
shu#屬 金屬 氣數 歲數 度數 資料 級數 數控 數學 引數 次數 正數 代數 實數 係數 分數 輩數  
shui#遊說  
shuo#數見 數見不鮮 傳說 聽說 妄說 實說  胡說 評說 分說 小說  
si#窺伺 伺弄 伺機 疑似 似是 好似 似曾 形似 酷似 貌似 似懂 勝似 恰似 近似 神似 賽似 看似 活似 強似 似乎 類似 相似 思  
su#宿主 宿命 歸宿 住宿 借宿 寄宿 宿營 夜宿 露宿 投宿 宿舍 名宿 整宿 食宿  
sui#尿泡  
ta#拓本 拓片 碑拓 疲沓 拖沓 雜沓 沓 塔 鴻塔  
tang#湯 鴨湯 雞湯  
tao#叨擾 叨光 陶 陶器  
tan#彈性 彈力 反彈  
ti#手提 提速 提意 提前 提早 提升 提議 提款 提婚 提包 耳提 提供 麥麥提 體  
tiao#空調 調教 烹調 調羹 調料 調皮  調控 調節 調整 調價 諧調  協調 調色 調侃 調味 失調 調治 調頻 調劑 調停 調休 調解  
ting#町 域町 聽  
tong#垌  
tui#褪色 褪毛  
tuo#拓 拓寬 拓荒 開拓 落拓 拓展 拓印  
tun#屯 囤積 囤聚  
wei#尾 響尾 尾巴 尾燈 船尾 追尾 尾椎 月尾  燕尾 尾數 年尾 歲尾 鳶尾 鳳尾 彗尾 尾翼 結尾 遺之 龍尾  齊鑫尾 麻尾 麥度 鹿尾  
wu#可惡 交惡 好惡 厭惡 憎惡 嫌惡 痛惡 深惡  
wan#藤蔓 枝蔓 瓜蔓 蔓兒  莞爾 萬 百萬 萬  
xia#蝦 蝦仁 青蝦 大蝦 蝦皮 對蝦 蝦子 蝦醬 蝦兵 蝦米 龍蝦 噶廈 廈門 嚇唬 嚇人 驚嚇 天蝦 龍蝦 皮皮蝦 麥蝦  
xi#棲棲 系 關係 星系 水系 繫念 體系 聯絡 系列 菜系 世系  蹊 蹊徑 溪 洗  
xiao#校 學校 切削 削麵 刀削 刮削  
xian#纖細 光纖 纖巧 纖柔 纖小 纖維 纖瘦 纖纖 化纖 纖秀 棉纖 纖塵  
xiang#巷 街巷 僻巷 巷子 龍門巷 六巷 龍灣巷 龍港巷 龍泉巷 龍巷 龍妙巷 齡巷 齊家巷 鼓樓巷 鼓巷 黎明巷 麻子巷 麻園巷 麥子巷 鵲巷  
xie#解數 出血 採血 換血 血糊 尿血 淤血 放血 血暈 血淋 便血 吐血 咯血 叶韻 蠍 蠍子  
xiu#銅臭 乳臭 成宿 星宿  
xin#馨 信 鴻信  
xing#深省 省視 內省 不省人事 省悟 省察 行 旅行 例行 行程 行樂 龍行 人行 流行 先行 行星 品行  發行 行政 風行 龍行 龍行 麟行  
xu#牧畜 畜產 畜牧 畜養 籲 氣籲 喘籲 吁吁 麥埂圩  
xue#削 削減 削弱  削瘦 削球 削平 削價 瘦削 剝削 削職  刪削 削肩  血 吸血  
xun#蕁 蕁麻 蕁麻疹  
ya#芽  
yao#發瘧 瘧子 約斤 稱約 鑰匙 金鑰 耀  
yan#吞嚥 嚥氣 咽喉  殷紅 醃 醃製 醃肉 醃菜 煙 菸草 名煙 菸酒  
ye#抽咽 哽咽 咽炎 下嚥 嗚咽 幽咽 悲咽 葉 綠葉 葉子 荷葉 落葉 菜葉 紅葉 樹葉 楓葉  茶葉 葉 鴻葉  液   
yi#自艾 懲艾 後尾 遺  屹  
yin#殷 殷勤 殷墟 殷切 殷鑑  
yo#杭育  
yu#谷渾 呼籲 籲請 籲求 育 體育 教育 育兒 熨帖 熨燙 於  
yuan#員  
yun#熨 熨斗 電熨斗  
yue#樂音 器樂 樂律 樂章 音樂 樂理 民樂 樂隊 聲樂 奏樂 絃樂 樂壇 管樂 配樂 樂曲 樂譜  鎖鑰 金鑰 樂團 鼓樂社 樂器 櫟陽 約 約會  
zan#積攢  
zang#寶藏 藏曆 藏文 藏香 藏語 藏青 藏族 藏醫 藏戲 藏藥 藏藍 蔵  
ze#擇 擇善  
zeng#曾孫 曾祖  
za#綁紮 結紮 包紮 捆紮  
zai#牛仔 龜仔 龍仔 鼻仔 羊仔  仔仔 麻仔  麵包仔 麥旺仔 鴻仔 煲仔 福仔  
zha#扎 馬紮 掙扎 扎啤 紮根 扎手 扎針 扎花 扎堆 紮營 紮實 穩紮 柞水 麻扎鎮 麻扎鄉 喳 柵欄  
zhai#擇菜  
zhan#不粘 貼上 粘連  
zhao#朝朝 明朝 朝暉 朝夕 朝思 有朝 今朝 朝氣 朝三 朝秦 朝霞 鷹爪 龍爪 魔爪 爪牙 失著 著數 龍爪槐  
zhe#折 破折 打折 疊 曲折 折衝 存摺  摺合 折舊 摺紙 骨折 折返 折價 折算 波折 摺扇 對摺 不折 折扣 七折 折中 拙著 要著 著文 新著 著 本著 對著  
zhi#標識 嘎吱 咯吱 吱扭 吱吱 繁殖 增殖 養 生殖 殖民 枝  
zhong#重 重量 鵬重 種  
zhou#粥  
zhu#屬意 著錄 撰著 名著 專著 著述 著作 顯著 昭著 原著 著名 著書 遺著 論著 著者 編著 卓著 譯著 著稱  
zhua#爪  
zhui#椎 椎骨 尾椎 椎間 腰椎 胸椎 頸椎 脊椎  
zhuo#執著 著裝 著落 著意 著力 附著 著筆 膠著 著手 著重 穿著 衣著 執著 著眼 著墨 著實 沉著 著陸 著想 著色  
zhuang#幢房 一幢 幢樓  
zi#吱聲 茲 來茲 今茲 仔細 仔豬  
zu#足 沐足 足道  
zuo#撮毛 小撮 柞綢 柞蠶 柞樹 柞木  
zui#咀脣 尖沙咀 黃達咀 黃土咀 鷹咀

ChineseToHanYuPYTest類

    package com.yulore.pinyin;  
      
    import java.io.BufferedReader;  
    import java.io.IOException;  
    import java.io.InputStream;  
    import java.io.InputStreamReader;  
    import java.util.Arrays;  
    import java.util.HashMap;  
    import java.util.List;  
    import java.util.Map;  
      
    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.exception.BadHanyuPinyinOutputFormatCombination;  
      
    /** 
     * 漢字轉拼音,能處理多音字 
     *  
     * @author feng bingbing 
     *  
     */  
      
    public class ChineseToHanYuPYTest {  
      
        private static Map<String, List<String>> pinyinMap = new HashMap<String, List<String>>();  
        private static long count = 0;  
      
        public static void main(String[] args) {  
      
            String str = "中國銀行長沙分行";  
    //      String str = "龍港巷店";  
              
            initPinyin("/duoyinzi_dic.txt");  
              
            String py = convertChineseToPinyin(str);  
            System.out.println(str+" = "+py);  
      
        }  
          
        /** 
         * 將某個字串的首字母 大寫 
         * @param str 
         * @return 
         */  
        public static String convertInitialToUpperCase(String str){  
            if(str==null){  
                return null;  
            }  
            StringBuffer sb = new StringBuffer();  
            char[] arr = str.toCharArray();  
            for(int i=0;i<arr.length;i++){  
                char ch = arr[i];  
                if(i==0){  
                    sb.append(String.valueOf(ch).toUpperCase());  
                }else{  
                    sb.append(ch);  
                }  
            }  
              
            return sb.toString();  
        }  
      
        /** 
         * 漢字轉拼音 最大匹配優先 
         * @param chinese 
         * @return 
         */  
        private static String convertChineseToPinyin(String chinese) {  
      
            StringBuffer pinyin = new StringBuffer();  
      
            HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();  
            defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);  
            defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);  
      
            char[] arr = chinese.toCharArray();  
      
            for (int i = 0; i < arr.length; i++) {  
      
                char ch = arr[i];  
      
                if (ch > 128) { // 非ASCII碼  
                    // 取得當前漢字的所有全拼  
                    try {  
      
                        String[] results = PinyinHelper.toHanyuPinyinStringArray(  
                                ch, defaultFormat);  
      
                        if (results == null) {  //非中文  
      
                            return "";  
                        } else {  
      
                            int len = results.length;  
      
                            if (len == 1) { // 不是多音字  
      
    //                          pinyin.append(results[0]);  
                                String py = results[0];       
                                if(py.contains("u:")){  //過濾 u:  
                                    py = py.replace("u:", "v");  
                                    System.out.println("filter u:"+py);  
                                }  
                                pinyin.append(convertInitialToUpperCase(py));  
                                  
                            }else if(results[0].equals(results[1])){    //非多音字 有多個音,取第一個  
                                  
    //                          pinyin.append(results[0]);  
                                pinyin.append(convertInitialToUpperCase(results[0]));  
                                  
                            }else { // 多音字  
                                  
                                System.out.println("多音字:"+ch);  
                                  
                                int length = chinese.length();  
                                  
                                boolean flag = false;  
                                  
                                String s = null;  
                                  
                                List<String> keyList =null;  
                                  
                                for (int x = 0; x < len; x++) {  
                                      
                                    String py = results[x];  
                                      
                                    if(py.contains("u:")){  //過濾 u:  
                                        py = py.replace("u:", "v");  
                                        System.out.println("filter u:"+py);  
                                    }  
      
                                    keyList = pinyinMap.get(py);  
                                      
                                    if (i + 3 <= length) {   //後向匹配2個漢字  大西洋   
                                        s = chinese.substring(i, i + 3);  
                                        if (keyList != null && (keyList.contains(s))) {  
    //                                  if (value != null && value.contains(s)) {  
      
                                            System.out.println("last 2 > " + py);  
    //                                      pinyin.append(results[x]);  
                                            pinyin.append(convertInitialToUpperCase(py));  
                                            flag = true;  
                                            break;  
                                        }  
                                    }  
                                      
                                    if (i + 2 <= length) {   //後向匹配 1個漢字  大西  
                                        s = chinese.substring(i, i + 2);  
                                        if (keyList != null && (keyList.contains(s))) {  
      
                                            System.out.println("last 1 > " + py);  
    //                                      pinyin.append(results[x]);  
                                            pinyin.append(convertInitialToUpperCase(py));  
                                            flag = true;  
                                            break;  
                                        }  
                                    }  
                                      
                                    if ((i - 2 >= 0) && (i+1<=length)) {  // 前向匹配2個漢字 龍固大  
                                        s = chinese.substring(i - 2, i+1);  
                                        if (keyList != null && (keyList.contains(s))) {  
                                              
                                            System.out.println("before 2 < " + py);  
    //                                      pinyin.append(results[x]);  
                                            pinyin.append(convertInitialToUpperCase(py));  
                                            flag = true;  
                                            break;  
                                        }  
                                    }  
                                      
                                    if ((i - 1 >= 0) && (i+1<=length)) {  // 前向匹配1個漢字   固大  
                                        s = chinese.substring(i - 1, i+1);  
                                        if (keyList != null && (keyList.contains(s))) {  
                                              
                                            System.out.println("before 1 < " + py);  
    //                                      pinyin.append(results[x]);  
                                            pinyin.append(convertInitialToUpperCase(py));  
                                            flag = true;  
                                            break;  
                                        }  
                                    }  
                                      
                                    if ((i - 1 >= 0) && (i+2<=length)) {  //前向1個,後向1個      固大西  
                                        s = chinese.substring(i - 1, i+2);  
                                        if (keyList != null && (keyList.contains(s))) {  
                                              
                                            System.out.println("before last 1 <> " + py);  
    //                                      pinyin.append(results[x]);  
                                            pinyin.append(convertInitialToUpperCase(py));  
                                            flag = true;  
                                            break;  
                                        }  
                                    }  
                                }  
                                  
                                if (!flag) {    //都沒有找到,匹配預設的 讀音  大   
                                      
                                    s = String.valueOf(ch);  
                                      
                                    for (int x = 0; x < len; x++) {  
                                          
                                        String py = results[x];  
                                          
                                        if(py.contains("u:")){  //過濾 u:  
                                            py = py.replace("u:", "v");  
                                            System.out.println("filter u:");  
                                        }  
                                          
                                        keyList = pinyinMap.get(py);  
                                          
                                        if (keyList != null && (keyList.contains(s))) {  
                                              
                                            System.out.println("default = " + py);  
    //                                      pinyin.append(results[x]);  //如果不需要拼音首字母大寫 ,直接返回即可  
                                            pinyin.append(convertInitialToUpperCase(py));//拼音首字母 大寫  
                                            break;  
                                        }  
                                    }  
                                }  
                            }  
                        }  
      
                    } catch (BadHanyuPinyinOutputFormatCombination e) {  
                        e.printStackTrace();  
                    }  
                } else {  
                    pinyin.append(arr[i]);  
                }  
            }  
            return pinyin.toString();  
        }  
      
        /** 
         * 初始化 所有的多音字片語 
         *  
         * @param fileName 
         */  
        public static void initPinyin(String fileName) {  
            // 讀取多音字的全部拼音表;  
            InputStream file = PinyinHelper.class.getResourceAsStream(fileName);  
      
            BufferedReader br = new BufferedReader(new InputStreamReader(file));  
      
            String s = null;  
            try {  
                while ((s = br.readLine()) != null) {  
      
                    if (s != null) {  
                        String[] arr = s.split("#");  
                        String pinyin = arr[0];  
                        String chinese = arr[1];  
      
                        if(chinese!=null){  
                            String[] strs = chinese.split(" ");  
                            List<String> list = Arrays.asList(strs);  
                            pinyinMap.put(pinyin, list);  
                        }  
                    }  
                }  
      
            } catch (IOException e) {  
                e.printStackTrace();  
            }finally{  
                try {  
                    br.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
    }  


執行結果

多音字:行
before 1 < hang
多音字:長
last 1 > chang
多音字:行
before 1 < hang
中國銀行長沙分行 = ZhongGuoYinHangChangShaFenHang

來自:http://blog.csdn.net/fx_sky/article/details/8531483