一般情況下,大家會使用下面的方法來進行漢字的拼音排序
var list = [ '王', '張','李'];

 

list.sort(function (a, b) {
return a.localeCompare(b);
});

 

localeCompare() :用本地特定的順序來比較兩個字串。
通過localeCompare這個方法來進行拼音排序的不可靠之處在于:
1. 很依賴中文作業系統
2. 很依賴瀏覽器的內核
也就是說,如果你的網站訪問者是通過非中文系統,或者非IE瀏覽器(如Chrome),那麼他將很可能無法看到我們所預期的拼音排序結果。
下面介紹一下我解決這個問題的辦法,希望能抛磚引玉哈:
本方法支援Unicode字元集中從0x4E00到 0x9FA5 的連續區域內共20902個來自中國(包括臺灣)、日本、韓國的漢字,即CJK(Chinese Japanese Korean)漢字。

 

var CompareStrings = {

 

db: '吖阿啊錒錒嗄哎哀...袰襨鐢閪闏霻鶑', // 其中省略幾萬字

 

getOrderedUnicode: function (char) {

 

var originalUnicode = char.charCodeAt();

 

if (originalUnicode >= 0x4E00 && originalUnicode <= 0x9FA5) {

 

var index = this.db.indexOf(char);

 

if (index > -1) {
return index + 0x4E00;
}
}

 

return originalUnicode;
},

 

compare: function (a, b) {

 

if (a == b) {
return 0;
}

 

// 這裡可以根據具體需求來改寫,目前的寫法是把空字串排在最後
if (a.length == 0) { return 1; }

 

if (b.length == 0) { return -1; }

 

var count = a.length > b.length ? b.length : a.length;

 

for (var i = 0; i < count; i++) {

 

var au = this.getOrderedUnicode(a[i]);
var bu = this.getOrderedUnicode(b[i]);

 

if (au > bu) {
return 1;
} else if (au < bu) {
return -1;
}
}
return a.length > b.length ? 1 : -1;

 

}

 

}

 

// 重寫系統原生的localeCompare
String.prototype.localeCompare = function (param) {
return CompareStrings.compare(this.toString(), param);
}

 

大家可以通過下面的連結下載到完整代碼
簡單介紹一下實現的原理:
1. 取得按拼音排序好的字形檔(db):有多種途徑可以達到目的,我是用JavaScript+C#組合完成的,先用腳本把所有漢字枚舉出來,再提交到C#後臺排序好,再輸出到前臺,這個只是準備工作哈,怎麼搞都可以。
2. 確定兩個字元誰比較大(getOrderedUnicode):因為排序的時候,不光要處理漢字,還要處理漢字以外的字元,所以比較器必須能識別所有的字元,這裡我們通過判斷一個字元是否是漢字來區別對待:如果是漢字,那麼就在排序好的字形檔裡搜索它的索引值,得到的索引值再加上Unicode字元集中第一個漢字所處的位置,就是在「校準」以後的Unicode字元集中的索引值了;如果不是漢字,那麼就直接返回它在Unicode字元集中的索引值即可。
3. 比較兩個字串(compare):逐一比較兩個字串中的每一個字元(在有效範圍內比較,也就是較短的那個字串的長度),如果發現a比b大,就返回1,反之返回-1。
4. 在有效範圍內比較結束後如果還沒分出勝負,就看誰比較長,例如a='123',b='1234',那麼較長的b要排在後面。
創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()