Scripts 学盟

标题: javascript 使用 gbk 编码的 urlencode [打印本页]

作者: Alvin    时间: 2011-3-25 00:29:15     标题: javascript 使用 gbk 编码的 urlencode

首先,先到百度搜索一下 "就爱学盟"
我们可以发现,结果页面的地址:http://www.baidu.com/s?wd=%BE%CD%B0%AE%D1%A7%C3%CB
"就爱学盟" 的编码结果是 "%BE%CD%B0%AE%D1%A7%C3%CB"

再用 js 在页面中 alert(encodeURIComponent("就爱学盟"))
看到的是 "%E5%B0%B1%E7%88%B1%E5%AD%A6%E7%9B%9F"


这两个结果是不一样的,前者是对字符进行 gbk 编码后,再转义的结果
后者是对字符进行 utf-8 编码后,再转义的结果


在 js 中要怎样实现使用gbk集进行 uri 编码呢
%HH 其实就只是把一个字节值转换成2位16进制数字,再在前头加上 % 而己
问题是 js 中没有函数可以支持取得字符的 gbk 编码值   str.charCodeAt(index)  取得的是 unicode 编码值


现在在网上流行的一种解决方案就是,在 js 建立一个 "字符->gbk码" 的映射表,通过查表来解决
因为字符多,这使得 js 雍肿了不少,而且在网上找到的这些映射表建的是不是全面,很难说


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

难道真的没有别的办法了吗?

其实在 ie 中,我们可以借助 VBScript 来支持这个工作

VBScript 中: (Asc("盟") + 65536) Mod 65536  就可以取得字符 "盟" 的 GBK 码 50123

但是其它浏览器不支持 VBScript ,可怎么办


有这么一个办法:

在页面中插入一个图片 img,   设置 img.src = "...中文...";  这个时候,浏览器会自动把这个 src 的值进行 uri 编码
而它是使用 gbk 还是 utf8 ,是根据文档编码来决定的.

这时候,我们就可以好好利用一下这个特性
  1. <meta http-equiv="Content-Type" content="text/html; charset=GBK" />
  2. <script type="text/javascript">
  3. function encodeURL(s) {
  4.     var img = document.createElement("img");
  5.     // escapeDBC 对多字节字符编码的函数
  6.     function escapeDBC(s) {
  7.         if (!s) return ""
  8.         if (window.ActiveXObject) {
  9.             // 如果是 ie, 使用 vbscript
  10.             execScript('SetLocale "zh-cn"', 'vbscript');
  11.             return s.replace(/[\d\D]/g, function($0) {
  12.                 window.vbsval = "";
  13.                 execScript('window.vbsval=Hex(Asc("' + $0 + '"))', "vbscript");
  14.                 return "%" + window.vbsval.slice(0,2) + "%" + window.vbsval.slice(-2);
  15.             });
  16.         }
  17.         // 其它浏览器利用浏览器对请求地址自动编码的特性
  18.         img.src = "nothing.action?separator=" + s;
  19.         return img.src.split("?separator=").pop();
  20.     }
  21.     // 把 多字节字符 与 单字节字符 分开,分别使用 escapeDBC 和 encodeURIComponent 进行编码
  22.     return s.replace(/([^\x00-\xff]+)|([\x00-\xff]+)/g, function($0, $1, $2) {
  23.         return escapeDBC($1) + encodeURIComponent($2||'');
  24.     });
  25. }

  26. alert(encodeURL("中文"));
  27. </script>
复制代码
这个函数,之前曾发在自己的博客里。
见:http://www.linjunhai.com/blog/article-172.xml
作者: 那个谁    时间: 2011-4-12 09:04:30

强。。。中文就是麻烦。




欢迎光临 Scripts 学盟 (http://www.iscripts.org/) Powered by Discuz! X2