1. 程式人生 > >pinyin4j獲取漢字正確的全拼和簡拼

pinyin4j獲取漢字正確的全拼和簡拼

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

工程目錄結構如下


原理:將可能出現的多音字 片語組合起來,用正確拼音當作其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

OK,搞定啦!!!