不说废话,直接上源代码:
1 var hex = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'); 2 var thestr = ''; 3 for (var a = 0; a < 16; a++) { 4 for (var b = 0; b < 16; b++) { 5 for (var c = 0; c < 16; c++) { 6 for (var d = 0; d < 16; d++) { 7 var ustr = '\\u' + hex[a] + hex[b] + hex[c] + hex[d]; 8 thestr += ustr; 9 } 10 } 11 } 12 } 13 eval('document.write(\'' + thestr + '\');');
简单解释一下。Javascript中的Unicode字符可以用“\u”后面加4位十六进制数字来表示,这实际上也是一种转义字符,也就是说我上面的程序只是遍历输出‘\u0000’~‘\uffff’,所以就输出了所有Unicode字符。
需要注意的一点是,我们一般的思路都是循环向变量里先存入"\u",再生成一个四位的十六进制数字继续存入变量,如代码:
1 var ustr='\u';//这行会报错 2 ustr+=hex[a]+hex[b]+hex[c]+hex[d];
但是事实情况是不能直接往变量里存“\u”,因为这样会被认为"\u"是一个非法的Unicode字符而导致JS代码报错;我的解决方案是使用转义字符'\\'来存入'\',如代码:
1 var ustr='\\'; 2 ustr+='u'; 3 ustr+=hex[a]+hex[b]+hex[c]+hex[d];
我们都知道,转义字符如'\t'在程序中会被认为是一个字符,那么如'\u89ab'这样的转义字符在程序中也应该是被认为是一个字符的,可我们现在内存中的"\u89ab"不是一个字符,而是6个字符,这样直接输出的话页面中只会原样显示"\u89ab",显然不是我们想要的那个字符,怎么办呢?很简单,使用Javascript自带的eval方法可以将字符串作为Javascript代码重新执行一遍,具体用法自己搜,重新执行的时候由于是一次性解析'\u89ab'这个数据,所以可以正确识别为一个Unicode转义字符,也就可以正确输出这个Unicode字符了。
表达能力有限,我已经努力用详细的语言来解释了,不过觉得还是有点不好理解。一层窗户纸,一筒就破。
其实我觉得另外一种算法性能更好一些,就是直接输入Unicode字符到变量中,不用使用eval转化就可以直接输出,在这抛砖引玉了,有待进一步研究。
更新
新算法,可能性能会有提升吧,先上代码:
1 var theString = ''; 2 for (var t = 0; t < 65536; t++) { 3 theString += String.fromCharCode(t) 4 } 5 document.write(theString);
是的!你没有看错!这不是片段!这是所有JS代码!就是只有这几行!
仔细看了一下String对象的文档才知道有String.fromCharCode()这么个神器,具体文档自己搜的啦,哈哈,别喷我懒。不知道性能如何。
本文章系受著作权法保护,未经著作人同意,不得盗用;使用或引用本文章内容请注明作者名、原地址:书中叶http://www.cnblogs.com/libook