最近在公司需要写一个管理系统,奈何php实在太差,所以无奈中使用ajax模型,没有用公司的js库,选择了jquery。
结果在一个search cgi中在链接中会使用中文,所以研究了半天。

先贴一下js中关于转码的一点知识:

js对文字进行编码涉及3个函数:escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent
1、   传递参数时需要使用encodeURIComponent,这样组合的url才不会被#等特殊字符截断。                            
例如:<script language=“javascript”>document.write(‘<a href=”http://passport.baidu.com/?logout&aid=7&u= +encodeURIComponent(“http://cang.baidu.com/bruce42″)+”>退出</a>’);</script>
2、   进行url跳转时可以整体使用encodeURI
例如:Location.href=encodeURI(“http://cang.baidu.com/do/s?word=百度&ct=21″);
3、   js使用数据时可以使用escape
例如:搜藏中history纪录。
4、   escape对0-255以外的unicode值进行编码时输出%u****格式,其它情况下escape,encodeURI,encodeURIComponent编码结果相同。
最多使用的应为encodeURIComponent,它是将中文、韩文等特殊字符转换成utf-8格式的url编码,所以如果给后台传递参数需要使用encodeURIComponent时需要后台解码对utf-8支持(form中的编码方式和当前页面编码方式相同)
escape不编码字符有69个:*+-,.,/,@,_,0-9,a-z,A-Z
encodeURI不编码字符有82个:!,#,$,&,’,(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z
encodeURIComponent不编码字符有71个:!, ‘,(,),*,-,.,_,~,0-9,a-z,A-Z

在管理系统的代码如下:

function GetMedia()
{
    var req=SplitGetRequest();
    var appid=req['appid'];
    var type_t=req['type'];
    var medianame=req['medianame'];
    jQuery.ajax({
//由于中文的原因
url:encodeURI(“/cgi-bin/mman_media_get.cgi?appid=”+appid+”&type=”+type_t+”&medianame=”+medianame),
dataType:”json”,
data:””,
type:”get”,
success:function(data,type){
ret = data.ret;
if (ret != 0){
return;
}
if(data.medianame != medianame) {
alert(“Error:medianame is error”);
}
jQuery(“#appid”).val(appid);

GetTypeList();

jQuery(“#type”).val(type_t);
},
error:function(xhr)
{
    alert(“Error:”+xhr.status);
}
});
}

由于medianame是中文,所以URL直接用
“/cgi-bin/mman_media_get.cgi?appid=”+appid+”&type=”+type_t+”&medianame=”+medianame
会出现问题,因此使用了encodeURI.
对于medianame = 空的.txt,真实的发包就是
http://mman.qq.com/cgi-bin/mman_media_get.cgi?appid=353&type=13&medianame=%E7%A9%BA%E7%9A%84.txt

OK,就这样~

分享一本jQuery的API使用手册

公司同事分享的一本jQuery的API使用手册,在网上搜了搜,貌似没有发现这本手册的下载,所以在这里分享给大家。 jquery_api.chm下载

阅读全文

1则回应给“在js中对中文和特殊字符转码”

  1. 斌斌说道:

    jquery 有param函数,就可以转码,并且ajax提交参数,你写成$.ajax({data:{param:’中文’}})这样,提交前也会调用param函数转码

    [回复]

发表评论