規律:半形空格的 charCode 為 32, 全形空格為 12288. 其他半形字元 ( 33 – 126 ) 與全形 ( 65281 – 65374 ) 的對應關係是:均相差 65248.
找好規律,代碼就好寫了:
var hash = {'32' : '\u3000'};// 半形轉全形function sbc2dbc(str) { var ret = [], i = 0, len = str.length, code, chr; for (; i < len; ++i) { code = str.charCodeAt(i); chr = hash[code]; if (!chr && code > 31 && code < 127) { chr = hash[code] = String.fromCharCode(code + 65248); } ret[i] = chr ? chr : str.charAt(i); } return ret.join('');}
同理:
var hash = {'12288' : ' '};// 全形轉半形function dbc2sbc(str) { var ret = [], i = 0, len = str.length, code, chr; for (; i < len; ++i) { code = str.charCodeAt(i); chr = hash[code]; if (!chr && code > 65280 && code < 65375) { chr = hash[code] = String.fromCharCode(code - 65248); } ret[i] = chr ? chr : str.charAt(i); } return ret.join('');}
上面的代碼會將 33 - 126 中間的符號也轉換。很多時候,這並不是我們需要的(比如將 @ 轉換為 @)。下面的代碼侵入性更小:
var hash = {};// 半形轉全形。僅轉換 [0-9a-zA-Z]function sbc2dbc_w(str) { var ret = [], i = 0, len = str.length, code, chr; for (; i < len; ++i) { code = str.charCodeAt(i); chr = hash[code]; if (!chr && (47 < code && code < 58 || 64 < code && code < 91 || 96 < code && code < 123)) { chr = hash[code] = String.fromCharCode(code + 65248); } ret[i] = chr ? chr : str.charAt(i); } return ret.join('');}
詳細測試頁面:sbc2dbc-test.html