- 注册时间
- 2011-3-21
- 最后登录
- 2022-3-22
- 在线时间
- 1191 小时
- 阅读权限
- 200
- 积分
- 9457
- 帖子
- 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
查看全部评分
-
|