当前位置: 网学 > 编程文档 > Ajax > 正文

AJAX在GB2312的中文编码传输 AJAX特殊字符编码正确方法

来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 13/07/12
后输出给客户端也不能显示。

如果按照文中所说的,
发送端用xmlHttp.send("regcode="+escape(regcode));

然后在服务器端将接收的数据套上两个编码encodeURIComponent(escape(xxxxxxx)),则显示的结果是:test%25u7A5Eest%2520test,同样不行。另外这个思路应是不对的,不知道这篇文章在网上被转抄时是否本身就有错,按理在客户端用escape编码传送后,在服务器端就应该反编码。或者REQUEST本身就有解码的作用。不需要再二次、三次编码。况且查了一下,escape和encodeURIComponent也无法对特殊字符编码。

我在服务器端做了如下输出:
复制代码 代码如下:
test2="test·test+test·回馈:"
Response.write test2&"前面是服务器直接输出的而非接收的特殊符号“·”间隔号。后面是接收的数据(内容与原AJAX发送的一样,用于对比):"

也就是说直接在服务器端生成一个同样的含特殊字符,这个服务器端文件已经用<%Response.charset="GB2312"%>定义好编码为GB2312。但输出的结果是,在服务器端生成的test2="test·test+test·回馈:"可以正常输出,而接收的AJAX值就不行了。
即使在客户端用JS三个编码参数escape()\encodeURI() \encodeURIComponent() 全部试过去,然后在服务器商反编码再输出,也是不行。这说明字串中的特殊符号在服务器端接收时就已经变形了。

现在问题界定在编码传递上了,为了说明这个问题,我又做了一个小试验:就是把这个字串赋值给ASP的一个变量再用ASP变量来赋值给JS,如下:
复制代码 代码如下:
<%
para="test·test+test·/"
para=Server.urlencode(para)
%>

然后转手给JS变量,如下:
复制代码 代码如下:
xmlHttp.open("POST",url,true);
var regcode="<%=para%>";
xmlHttp.setRequestHeader(''Content-type'',''application/x-www-form-urlencoded;charset=gb2312'');
xmlHttp.send("regcode="+regcode);

结果正常了,这充分说明ASP的server.urlencode能完整对特殊字符编码。而JS还是有欠缺。

那现在怎么办?

在实在没办法的情况下,我想到了即然encodeURIComponent()可以比encode()对更多特殊字符编码,那么不妨像多重MD5加密一样,增加强化剂,于是我套用了两个encodeURIComponent(),现在代码是:
复制代码 代码如下:
var regcode="test·test+test·/";
xmlHttp.setRequestHeader(''Content-type'',''application/x-www-form-urlencoded;charset=gb2312'');
xmlHttp.send("regcode="+encodeURIComponent(encodeURIComponent(regcode)));

上面是客户端的,再把服务器端改成:
复制代码 代码如下:
<script language="javascript" runat="server">
function decodestr(str){
return decodeURIComponent(decodeURIComponent(str));
}
</script>
<%
dim reg
reg=Request("regcode")
test2="test·test+test·回馈:"
Response.write test2&"前面是服务直接输入的而非接收的特殊符号“·”间隔号。后面是接收的数据(内容与原AJAX发送的一样,用于对比):"
Response.write decodestr(reg)
%>

终于完美看到了AJAX输出的特殊字符。间隔号和+号都出来了,
“test·test+test·/”
为了进一步验证,我把下面encodeURIComponent也无法编码的个别特殊字符全加进来了,如下:
复制代码 代码如下:
var regcode="汉字开头:! @ # content * ( ··) = : / ; ? + 结尾,中间全是特殊字符。";

结果也正常了,太棒!
不过一般AJAX传给服务器的数据是要应用的,否则没有意义,为了再进一步验证数据是否一样,我把服务器端做了小修改,如下:
复制代码 代码如下:
<%
dim reg
reg=Request("regcode")
test2="汉字开头:! @ # content * ( ··) = : / ; ? + 结尾,中间全是特殊字符。"
  • 上一篇资讯: 一个AJAX类代码
  • 网学推荐

    免费论文

    原创论文

    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号