由於在 browser 裡的 javascript 字串中, 處理字元的 String.fromCharCode 及 charCodeAt 函數都是使用 unicode , 所以了解了 unicode 及 utf-8 的對應關係後, 才能了解這組程式碼的功能, 對照表如下:
(圖片引用自: http://zh.wikipedia.org/wiki/UTF-8)
程式碼如下: (僅處理4bytes以下的字元)
代碼: 選擇全部
function escape_utf8(data) {
if (data == '' || data == null) {
return '';
}
data = data.toString();
var buffer = '';
for (var i = 0; i < data.length; i++) {
var c = data.charCodeAt(i);
var bs = new Array();
if (c > 0x10000) {
// 4 bytes
bs[0] = 0xF0 | ((c & 0x1C0000) >>> 18);
bs[1] = 0x80 | ((c & 0x3F000) >>> 12);
bs[2] = 0x80 | ((c & 0xFC0) >>> 6);
bs[3] = 0x80 | (c & 0x3F);
} else if (c > 0x800) {
// 3 bytes
bs[0] = 0xE0 | ((c & 0xF000) >>> 12);
bs[1] = 0x80 | ((c & 0xFC0) >>> 6);
bs[2] = 0x80 | (c & 0x3F);
} else if (c > 0x80) {
// 2 bytes
bs[0] = 0xC0 | ((c & 0x7C0) >>> 6);
bs[1] = 0x80 | (c & 0x3F);
} else {
// 1 byte
bs[0] = c;
}
for (var j = 0; j < bs.length; j++) {
var b = bs[j];
var hex = nibble_to_hex((b & 0xF0) >>> 4) + nibble_to_hex(b & 0x0F);
buffer += '%' + hex;
}
}
return buffer;
}
function nibble_to_hex(nibble) {
var chars = '0123456789ABCDEF';
return chars.charAt(nibble);
}
若執行如下程式, 可以得正確的 utf-8 碼:
代碼: 選擇全部
document.write(escape_utf8("我"));
// %E6%88%91