不说废话,直接上源代码:

 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

posted on 2014-02-27 14:28  书中叶  阅读(1472)  评论(1编辑  收藏  举报