在读Sizzle源码的时候,看到这样一个正则。
identifier = "(?:\\.|[\w-]|[^\x00-\xa0])+
。
想知道x00-xa0
所表示的字符区间到底是些什么字符,与是就想到将其转为字符输出来看看。查了一些资料,Js转解码有点麻烦。
先说转编(编码)。
Number
对象提供了一个比较强大的函数,toString([radix])
。可以将数字转为指定进制(2~36)的字符串。String
对象提供了一个charCodeAt(index)
函数,可以将一个字符串中index位置的字符转成Unicode码。(80).toString(16); // "50" "abc".charCodeAt(0); // 97
因为Unicode码的编码是
0x0000
的形式,所以如果0x之后不足四位的,需要在高位补0,凑成四位。
所以一个字符串编码的函数核心代码大致如下:function coding(str){ var unic, resultSet = [], i, len = str.length, cur; for(i = 0; i < len; i++){ unic = str.charCodeAt(i).toString(16); while(unic.length < 4){ unic = "0" + unic; } resultSet.push("\u" + unic); } return resultSet.join(""); } coding("你好"); // "u4f60u597d"
再说解码。
所查资料中,得到两种解码的方法。
var str = eval(""" + "u4f60u597d" + """); console.log(str); // "你好";
var str = unescape("u4f60u597d".replace(/\u/g, "%u")); console.log(str); // "你好";
别问我第二种为什么要替换成"%u",我也不知道,我只能给你一个链接
有了上面的基础,可以来看下上面正则中定义的范围有哪些字符了。结果看图。
var cache = {order: []}, i,
reg = /\u/g, unic, cur, html = [];
for (i = parseInt("0x00", 16); i <= parseInt("0xa0"); i++) {
cur = (i).toString(16);
// 转成unicode码时,如果不足四位,需要补0
while (cur.length < 4) {
cur = "0" + cur;
}
unic = "\u" + cur;
cache[unic] = unescape(unic.replace(reg, "%u"));
cache.order.push(unic);
}
html.push("<table>");
for (i = 0; i < cache.order.length; i += 5) {
html.push("<tr>");
for (var k = 0; k < 5; k++) {
html.push("<td>");
html.push(cache.order[i + k]
? (cache.order[i + k] + " : " + cache[cache.order[i + k]])
: ""
);
html.push("</td>");
}
html.push("</tr>");
}
html.push("<table>");
document.body.innerHTML = html.join("
");