由于項目中需要把漢字轉(zhuǎn)成拼音,并且是涉及到姓名的轉(zhuǎn)換,因此不能排除有生僻字的可能.我先是查了一下漢字編碼的知識,漢字編碼知識如下:
http://www.knowsky.com/resource/gb2312tbm.htm;這里說的是區(qū)位碼,實際上區(qū)位碼和漢字GBK碼就是同一個東西,在區(qū)位碼的區(qū)號和位號上分別加上0xA0就得到了GB2312編碼了,但是一看編碼規(guī)律,只有第一次漢字和讀音掛鉤,第二級漢字是按照部首進(jìn)行編排的,所以應(yīng)該是沒有什么絕對的關(guān)系的。于是又在網(wǎng)上找其他的資料,用java實現(xiàn)的,網(wǎng)上流傳廣泛的有兩種方法:但是就我來看都不怎么的,第一種是把漢字讀音和相應(yīng)區(qū)的漢字對照;但是只是涉及了常用的漢字,遇到生僻字是不能轉(zhuǎn)換的;第二種號稱完整版的方法,居然把漢字碼表的基本對應(yīng)關(guān)系放到了java類中,并且還說什么為了防止函數(shù)字符超過65535長度的限制,用了100多個init函數(shù).我實在是不能理解.其實我想得很簡單:找一個漢字拼音對照表,然后初始化時讀入到HashMap中,用漢字為Key,用拼音作為value,然后就可以獲取了.不過也考慮過,GBK碼表的長度有27954個漢字,從來沒有用HashMap處理過如此長度得東西,不知道會不會有什么限制,不過隨便想了一下應(yīng)該不可能:第一java HashMap的長度不受此限制;第而,查找漢字時,在HashMap中肯定時用二分法或者更好得算法來取Value,那么最壞的情況也不過時lg2(27954),這是很快的.很快實現(xiàn)了,試了一下性能還不錯,在我的機器上:init的時間200ms,查找一個漢字的平均時間為8ms.其實之前我還想過加快速度的更好的方法:把這個漢字編碼表自己先處理一遍,先利用冒泡排序法,把編碼對應(yīng)在數(shù)據(jù)文件里排好,給每個讀音漢字對照分配固定的足夠長的字符寬度,對于編碼中沒有漢字的區(qū)域,用空白代替;這樣漢字的拼音編碼關(guān)系就和漢字本身的編碼建立了聯(lián)系,減去第一個漢字的編碼值,就可以得到漢字拼音在數(shù)據(jù)文件中絕對位置了,然后就可以根據(jù)漢字本身的編碼然后用文件隨機讀取的方法,取到拼音值,不知道這樣是不是會比用hashMap的方法要快一點?不過既然HashMap的方案可行了.那么就暫時不取測試了.
相關(guān)的資料:
(1) GBK漢字全拼音單字源碼表
(2) 單字多音碼表
http://www.knowsky.com/resource/gb2312tbm.htm;這里說的是區(qū)位碼,實際上區(qū)位碼和漢字GBK碼就是同一個東西,在區(qū)位碼的區(qū)號和位號上分別加上0xA0就得到了GB2312編碼了,但是一看編碼規(guī)律,只有第一次漢字和讀音掛鉤,第二級漢字是按照部首進(jìn)行編排的,所以應(yīng)該是沒有什么絕對的關(guān)系的。于是又在網(wǎng)上找其他的資料,用java實現(xiàn)的,網(wǎng)上流傳廣泛的有兩種方法:但是就我來看都不怎么的,第一種是把漢字讀音和相應(yīng)區(qū)的漢字對照;但是只是涉及了常用的漢字,遇到生僻字是不能轉(zhuǎn)換的;第二種號稱完整版的方法,居然把漢字碼表的基本對應(yīng)關(guān)系放到了java類中,并且還說什么為了防止函數(shù)字符超過65535長度的限制,用了100多個init函數(shù).我實在是不能理解.其實我想得很簡單:找一個漢字拼音對照表,然后初始化時讀入到HashMap中,用漢字為Key,用拼音作為value,然后就可以獲取了.不過也考慮過,GBK碼表的長度有27954個漢字,從來沒有用HashMap處理過如此長度得東西,不知道會不會有什么限制,不過隨便想了一下應(yīng)該不可能:第一java HashMap的長度不受此限制;第而,查找漢字時,在HashMap中肯定時用二分法或者更好得算法來取Value,那么最壞的情況也不過時lg2(27954),這是很快的.很快實現(xiàn)了,試了一下性能還不錯,在我的機器上:init的時間200ms,查找一個漢字的平均時間為8ms.其實之前我還想過加快速度的更好的方法:把這個漢字編碼表自己先處理一遍,先利用冒泡排序法,把編碼對應(yīng)在數(shù)據(jù)文件里排好,給每個讀音漢字對照分配固定的足夠長的字符寬度,對于編碼中沒有漢字的區(qū)域,用空白代替;這樣漢字的拼音編碼關(guān)系就和漢字本身的編碼建立了聯(lián)系,減去第一個漢字的編碼值,就可以得到漢字拼音在數(shù)據(jù)文件中絕對位置了,然后就可以根據(jù)漢字本身的編碼然后用文件隨機讀取的方法,取到拼音值,不知道這樣是不是會比用hashMap的方法要快一點?不過既然HashMap的方案可行了.那么就暫時不取測試了.
相關(guān)的資料:
(1) GBK漢字全拼音單字源碼表
(2) 單字多音碼表