JavaScript 全半角转换
规律:半角空格的 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

February 2nd, 2010 on 17:39
上面的代码会将 33 – 126 中间的符号也转换。很多时候,这并不是我们需要的(比如将 @ 转换为 @)。下面的代码侵入性更小
re: 不太理解博主这段话的意思. 你的代码不就是半角转全角么? 为什么说是代码侵入呢?而且
想问下 你最后方法所躲过的那些字符 为什么不转呢?
(47 < code && code < 58 ||
64 < code && code < 91 ||
96 < code && code < 123))
没太看懂你的用意.请指教
February 2nd, 2010 on 18:03
@BlueDream: 这跟项目的实际需求相关。目前我了解到的项目,并不期望将 @ 等符号也转义,仅需转义数字和字母。符号的转义会带来麻烦,比如英文句号 . 在中文里,小数点也是 . 句号是 。 因此 . 如何转,需要根据上下文来决定。不如不转,保持原样。
March 23rd, 2010 on 16:59
哥哥你的代码写的太nb了
leave a reply