设为首页收藏本站

Scripts 学盟

 找回密码
 加入学盟

QQ登录

只需一步,快速开始

查看: 1748|回复: 5
打印 上一主题 下一主题

闲说关于 \uHHHH 格式文本的转换问题 [复制链接]

管理员

超级大菜鸟

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
在某论坛看到过类似于这样子的问题:
如何把形如 \u811A\u672C\u5B66\u76DF 的字符串内容转换成正常汉字


跟帖中出现:
  1. // new String(...) 可以解决
  2. var s = "\u811A\u672C\u5B66\u76DF";
  3. alert(new String(s)); // 正常
复制代码
当然,这个答案是不正确的。
为什么呢,虽然 alert(new String(s)); 可以看到正常结果。。。

确实是弹出 "脚本学盟", 但这个转换并不是程序执行过程中完成的。

我们都知道 \uHHHH  其实是字符常量的转义表示。  后面 HHHH 部分是 4位十六进制表示的字符 unicode 编码值

而将 "\u811A\u672C\u5B66\u76DF" 转换为 "脚本学盟" 这个工作是,引擎在脚本解释期就完成的工作。 而不是脚本执行期完成的工作,所以 new String( ... ) 完全没有解决这个问题。


---------------------

好了,言归正传,那我们如何写程序完成这个转换呢。。。

最直接的方法,就是使用查找,分割等手段,将每一组形如 "\uHHHH" 的文本,并取后四位解析为整数,再通过 String.fromCharCode 函数转为字符,最后是重新拼装字符串
  1. function convert(s) {
  2.         var pos = -1, lastPos = 0, result = [];
  3.         while ((pos=s.indexOf("\\u", lastPos)) > -1) {
  4.                 result.push( s.slice(lastPos, pos) );
  5.                 result.push( String.fromCharCode(parseInt(s.substr(pos+2, 4), 16)));
  6.                 lastPos = pos + 6;
  7.         }
  8.         result.push( s.slice( lastPos ) );
  9.         return result.join("");
  10. }
  11. var s = "\\u811A\\u672C\\u5B66\\u76DF";
  12. alert( convert(s) );
复制代码
当然,这样的代码,写起来还是比较费力的,高手就另当别论了。。。像我们这样的菜鸟。还是觉得特费劲

---------------------

其实呢,这里如果用上 String 对象的原型方法 replace ,则可以方便很多,语法
stringObject.replace(regexp/substr,replacement)
ECMAScript v3 规定,replace() 方法的参数 replacement 可以是函数而不是字符串。在这种情况下,每个匹配都调用该函数,它返回的字符串将作为替换文本使用。该函数的第一个参数是匹配模式的字符串。接下来的参数是与模式中的子表达式匹配的字符串,可以有 0 个或多个这样的参数。接下来的参数是一个整数,声明了匹配在 stringObject 中出现的位置。最后一个参数是 stringObject 本身
  1. function convert(s) {
  2.         return s.replace(/\\u([\da-f]{4})/ig, function($, $1) {
  3.                 return String.fromCharCode(parseInt($1, 16));
  4.         });
  5. }

  6. var s = "\\u811A\\u672C\\u5B66\\u76DF";

  7. alert( convert(s) );
复制代码
省掉查找,分割,重新拼装的麻烦,是不是又简单许多。

-------------------

呵呵,其实呢,有些同学可能看到 "\uHHHH" 就会想去"%uHHHH"  哈哈,就差一个字符嘛,是不是
而对于 "%uHHHH" 这样格式的内容,是有一个内置函数可以利用的,就是 unescape 了,比如:
  1. alert( unescape("%u811A%u672C%u5B66%u76DF")  );
复制代码
那这个时候,我们也只需要把  "\uHHHH" 格式内容转变成 "%uHHHH"  是不是就更容易搞定了
  1. function convert(s) {
  2.         return unescape(s.replace(/\\u/ig, "%u"));
  3. }
  4. var s = "\\u811A\\u672C\\u5B66\\u76DF";
  5. alert( convert(s) );
复制代码
-------------------

呵呵,够方便吧。。。
其实呢,还有个更方便的方法。 eval 记得不?
eval(string)  可以将字符串当成脚本,将在当前上下文中解释执行
  1. function convert(s) {
  2.         return eval("\""+s+"\"");
  3. }
  4. var s = "\\u811A\\u672C\\u5B66\\u76DF";
  5. alert( convert(s) );
复制代码
------------------

嘿嘿,这 js 就是灵活,一个东东还能玩这么多花样。

没事就瞎侃了这么多,也没有什么核心,但也可能对大家有一点点帮助



Go,  努力,咱一起学习,一起进步
1

查看全部评分

分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
分享分享0 收藏收藏0

Rank: 8Rank: 8

2#
momo 发表于 2011-6-11 22:54:20 |只看该作者
前来拜读!!
过了爱做梦的年纪
轰轰烈烈不如平静

使用道具 举报

管理员

超级大菜鸟

Rank: 9Rank: 9Rank: 9

3#
混混@普宁.中国 实名认证  发表于 2011-6-11 23:25:17 |只看该作者
momo 发表于 2011-6-11 22:54
前来拜读!!

摸摸吉祥!

一直等你呢

使用道具 举报

Rank: 6Rank: 6

4#
Yisin 发表于 2011-6-14 21:51:19 来自手机 |只看该作者
学      习
路不好走,你却依旧满眼的爱,找不到理由...

使用道具 举报

管理员

超级大菜鸟

Rank: 9Rank: 9Rank: 9

5#
混混@普宁.中国 实名认证  发表于 2011-6-15 00:16:24 |只看该作者
Yisin 发表于 2011-6-14 21:51
学      习

又只是学习。。。

还要分享

使用道具 举报

Rank: 6Rank: 6

6#
Yisin 发表于 2011-6-15 20:12:01 来自手机 |只看该作者
我哪有什么好分享的
路不好走,你却依旧满眼的爱,找不到理由...

使用道具 举报

您需要登录后才可以回帖 登录 | 加入学盟

手机版|Scripts 学盟   |

GMT+8, 2024-5-2 10:27 , Processed in 1.082216 second(s), 12 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部