- 注册时间
 - 2011-3-21
 - 最后登录
 - 2025-4-11
 - 在线时间
 - 1191 小时
 - 阅读权限
 - 200
 - 积分
 - 9459
 - 帖子
 - 1256
 - 精华
 - 0
 - UID
 - 1
  
 
 
 
    
 | 
在某论坛看到过类似于这样子的问题:如何把形如 \u811A\u672C\u5B66\u76DF 的字符串内容转换成正常汉字  
 
跟帖中出现:- // new String(...) 可以解决
 
 - var s = "\u811A\u672C\u5B66\u76DF";
 
 - alert(new String(s)); // 正常
 
  复制代码 当然,这个答案是不正确的。 
为什么呢,虽然 alert(new String(s)); 可以看到正常结果。。。 
 
确实是弹出 "脚本学盟", 但这个转换并不是程序执行过程中完成的。 
 
我们都知道 \uHHHH  其实是字符常量的转义表示。  后面 HHHH 部分是 4位十六进制表示的字符 unicode 编码值 
 
而将 "\u811A\u672C\u5B66\u76DF" 转换为 "脚本学盟" 这个工作是,引擎在脚本解释期就完成的工作。 而不是脚本执行期完成的工作,所以 new String( ... ) 完全没有解决这个问题。 
 
 
--------------------- 
 
好了,言归正传,那我们如何写程序完成这个转换呢。。。 
 
最直接的方法,就是使用查找,分割等手段,将每一组形如 "\uHHHH" 的文本,并取后四位解析为整数,再通过 String.fromCharCode 函数转为字符,最后是重新拼装字符串- function convert(s) {
 
 -         var pos = -1, lastPos = 0, result = [];
 
 -         while ((pos=s.indexOf("\\u", lastPos)) > -1) {
 
 -                 result.push( s.slice(lastPos, pos) );
 
 -                 result.push( String.fromCharCode(parseInt(s.substr(pos+2, 4), 16)));
 
 -                 lastPos = pos + 6;
 
 -         }
 
 -         result.push( s.slice( lastPos ) );
 
 -         return result.join("");
 
 - }
 
 - var s = "\\u811A\\u672C\\u5B66\\u76DF";
 
 - alert( convert(s) );
 
  复制代码 当然,这样的代码,写起来还是比较费力的,高手就另当别论了。。。像我们这样的菜鸟。还是觉得特费劲    
 
--------------------- 
 
其实呢,这里如果用上 String 对象的原型方法 replace ,则可以方便很多,语法 
stringObject.replace(regexp/substr,replacement) ECMAScript v3 规定,replace() 方法的参数 replacement 可以是函数而不是字符串。在这种情况下,每个匹配都调用该函数,它返回的字符串将作为替换文本使用。该函数的第一个参数是匹配模式的字符串。接下来的参数是与模式中的子表达式匹配的字符串,可以有 0 个或多个这样的参数。接下来的参数是一个整数,声明了匹配在 stringObject 中出现的位置。最后一个参数是 stringObject 本身 - function convert(s) {
 
 -         return s.replace(/\\u([\da-f]{4})/ig, function($, $1) {
 
 -                 return String.fromCharCode(parseInt($1, 16));
 
 -         });
 
 - }
 
  
- var s = "\\u811A\\u672C\\u5B66\\u76DF";
 
  
- alert( convert(s) );
 
  复制代码 省掉查找,分割,重新拼装的麻烦,是不是又简单许多。 
 
------------------- 
 
呵呵,其实呢,有些同学可能看到 "\uHHHH" 就会想去"%uHHHH"  哈哈,就差一个字符嘛,是不是 
而对于 "%uHHHH" 这样格式的内容,是有一个内置函数可以利用的,就是 unescape 了,比如:- alert( unescape("%u811A%u672C%u5B66%u76DF")  );
 
  复制代码 那这个时候,我们也只需要把  "\uHHHH" 格式内容转变成 "%uHHHH"  是不是就更容易搞定了- function convert(s) {
 
 -         return unescape(s.replace(/\\u/ig, "%u"));
 
 - }
 
 - var s = "\\u811A\\u672C\\u5B66\\u76DF";
 
 - alert( convert(s) );
 
  复制代码 ------------------- 
 
呵呵,够方便吧。。。 
其实呢,还有个更方便的方法。 eval 记得不? 
eval(string)  可以将字符串当成脚本,将在当前上下文中解释执行- function convert(s) {
 
 -         return eval("\""+s+"\"");
 
 - }
 
 - var s = "\\u811A\\u672C\\u5B66\\u76DF";
 
 - alert( convert(s) );
 
  复制代码 ------------------ 
 
嘿嘿,这 js 就是灵活,一个东东还能玩这么多花样。 
 
没事就瞎侃了这么多,也没有什么核心,但也可能对大家有一点点帮助 
 
   
 
Go,  努力,咱一起学习,一起进步 |   
 
- 
1
查看全部评分 
 
- 
 
 
  
 
 |