這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
說到按中文拼音排序,很多人就想到了通過『拼音字典』的相關庫來實現。隨便在github搜尋一下 拼音 發現庫確實挺多的,不過實現成本都有點高。再搜尋 拼音排序 還真有,我簡單的看了下,實現方式五花八門。
今天分享一個按拼音排序的小技巧,與語言無關,但是用PHP實現最簡單就用PHP做示範。
$province_arr = ['山東','山西','安徽','北京','福建','甘肅','廣東','貴州'];usort($province_arr,function($a,$b){ $a = iconv('UTF-8', 'GBK//IGNORE', $a); $b = iconv('UTF-8', 'GBK//IGNORE', $b); return $a>$b?1:-1;});print_r($province_arr);/**結果如下Array( [0] => 安徽 [1] => 北京 [2] => 福建 [3] => 甘肅 [4] => 廣東 [5] => 貴州 [6] => 山東 [7] => 山西)**/
不算閉包函數的話一行代碼就實現了『將漢字用拼音排序』的功能,當然這段代碼有一點缺陷就是數組中的每一行資料都執行了兩次iconv() 函數,這是可以最佳化的。另一點就是擴充性不足,遇到英文開頭的字串時需要做特殊處理。除此之外相當給力的一種方法,下面說說他排序的原理。
GBK編碼,是對GB2312編碼的擴充,因此完全相容GB2312-80標準。GBK編碼依然採用雙位元組編碼方案,其編碼範圍:8140-FEFE,剔除xx7F碼位,共23940個碼位。共收錄漢字和圖形符號21886個,其中漢字(包括部首和構件)21003個,圖形符號883個。GBK編碼支援國際標準ISO/IEC10646-1和國家標準GB13000-1中的全部中日韓漢字,並包含了BIG5編碼中的所有漢字。GBK編碼方案於1995年12月15日正式發布,這一版的GBK規範為1.0版。更新介紹
上面一段是GBK編碼的簡介,要是認真看GBK編碼的介紹的話會發現一個很有意思的事情。
GBK編碼漢字區包括:
a. GB 2312 漢字區。即 GBK/2: B0A1-F7FE。收錄 GB 2312 漢字 6763 個,按原順序排列。
b. GB 13000.1 擴充漢字區。包括:
- GBK/3: 8140-A0FE。收錄 GB 13000.1 中的 CJK 漢字 6080 個。
- GBK/4: AA40-FEA0。收錄 CJK 漢字和增補的漢字 8160 個。CJK 漢字在前,按 UCS 代碼大小排列;增補的漢字(包括部首和構件)在後,按《康熙字典》的頁碼/字位排列。
我們發現GBK編碼的兩次擴充都是基於拼音做的編碼排序,所以整個GBK漢字區的中文符號都內建拼音權重。所以通過這個權重我們能輕鬆的實現『將漢字用拼音排序』功能。
另外GBK編碼與程式設計語言無關,我們通過Java,JS,Golang都能很輕鬆的實現拼音排序功能。
更多相關文章請移步我的部落格-原文連結:按中文拼音排序的小技巧