当前位置: 首页 > news >正文

Ajax使用POST提交中文乱码问题(转)

前段时间写JSP,使用AJAX以POST方式提交数据,如果是中文字符提交就会乱码,后来写ASP时用到AJAX以POST方式提交数据,中文一样是乱码。搜索一下相关资料,问题应该是提交数据时是以UTF-8编码提交,所以接收时如果使用GB2312或者其它中文编码的话就会乱码。

使用GET方式提交数据的时候,中文问题很好解决,setRequestHeader("Content-Type","text/html; encoding=gb18030")就可以了。但这个方法在POST方式中却不起作用。大家都知道GET方式提交数据有长度限制,有时我们必须使用 POST方式来提交数据。

对于使用POST,JSP的解决方法如下
使用escape(或encodeURI,两个函数都是JavaScript的函数,功能基本相同,可以查一下相关的帮助),但要使用两次,这个是关键。

初始页面内容如下(hello.jsp):
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>AJAX提交页面</title>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<script type="text/javascript">
function justdo(){
    var post = "name=王力猛&email=wallimn@sohu.com&bokee=http://wallimn.bokee.com";
    post = encodeURI(post);
    post = encodeURI(post);    //两次,很关键
    var xmlObj = new ActiveXObject("Msxml2.XMLHTTP");
    var URL = "act.jsp";    //文件名需要调整成测试时的相应位置
    xmlObj.open("POST",URL,true);
    xmlObj.setRequestHeader("Cache-Control","no-cache");
    xmlObj.setRequestHeader("Content-Type","application/x-www-form-urlencoded;");
    xmlObj.send(post);    //注意:POST方式,使用这个来发送内容
}
</script>
</head>
<body>
<input type="button" value="提交" οnclick="justdo()" />
</body>
</html>



Ajax请求处理页面(act.jsp)的内容如下:
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@page import="java.net.URLDecoder"%>
<html>
<head>
<title>ajax deal</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head>
<body>
<%
//遍历输出参数内容。
for (Enumeration e = request.getParameterNames(); e.hasMoreElements();) {
    String h = (String)e.nextElement();
    String v = request.getParameter(h);
    String mm = java.net.URLDecoder.decode(v, "UTF-8");
    System.out.println("请求参数: " + h + " = " + mm);
}
%>
</body>
</html>


分析:当调用request.getParameter()函数时,会自动进行一次URI的解码过程,调用时内置的解码过程会导致乱码出现。而URI编码两次后,request.getParameter()函数得到的是原信息URI编码一次的内容。再用可控的解码函数 java.net.URLDecoder.decode()就可解出原始的正确的信息。


对于ASP,可以在客户端使用JavaScript的encodeURIComponent函数(其它编码函数可能也行,没有试)编码两次,然后ASP使用Request.Form接收后使用JavaScript的decodeURIComponent解码一次:

初始页面内容如下(hello.asp):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>AJAX提交页面</title>
<meta http-equiv="Content-Type" content="text/html; charset=GB2312">
<script type="text/javascript">
function justdo(){
    var post = "name=" +
encodeURIComponent(encodeURIComponent("王力猛"));    //两次
    var xmlObj = new ActiveXObject("Msxml2.XMLHTTP");
    var URL = "act.asp";    //文件名需要调整成测试时的相应位置
    xmlObj.open("POST",URL,true);
    xmlObj.setRequestHeader("Cache-Control","no-cache");
    xmlObj.setRequestHeader("Content-Type","application/x-www-form-urlencoded;");
    xmlObj.send(post);    //注意:POST方式,使用这个来发送内容
}
</script>
</head>
<body>
<input type="button" value="提交" οnclick="justdo()" />
</body>
</html>


Ajax请求处理页面(act.asp)的内容如下:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>ajax deal</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head>
<body>
<%
Dim context
context = decodeText(Request.Form("name"))
Response.Write("name=" & context)
%>
</body>
</html>

<script language="javascript" runat="server">
function decodeText(str){
    return (str == null ? "" : decodeURIComponent(str));
}
</script>


ASP处理的原理跟JSP的差不多,都是在客户端编码两次,在服务器端解码一次。以上方法是我总结网上的方法和自己的研究写出来的,如果朋友你有更加好的方法请指教。

相关文章:

  • css网页背景渐变
  • 运行代码,复制代码,保存代码
  • IE6 IE7 IE8 FF浏览器的CSS兼容问题(转)
  • ASP 编程中 20 个非常有用的例子
  • position 绝对定位的问题
  • phpmyadmin建表出错 #1064 - You have an error in your SQL syntax;
  • 一个女程序员的征婚信息
  • :“Failed to access IIS metabase”解决方法
  • 用户***/aspnet登陆失败
  • sql 2005拒绝了对对象 'xxx' (数据库 'xxx',架构 'dbo')的 SELECT 权限
  • 用min-height实现最小高度(兼容IE6、IE7、FF)
  • css 非表格垂直对齐效果代码
  • msxml6.dll (0x80072EFD) A connection with the server could not be established
  • 怎么查看80端口占用情况? 如何查看端口占用情况?
  • iis 出现HTTP 错误 403.1 禁止访问:禁止执行访问错误
  • [LeetCode] Wiggle Sort
  • [译]CSS 居中(Center)方法大合集
  • exports和module.exports
  • extjs4学习之配置
  • Fundebug计费标准解释:事件数是如何定义的?
  • gops —— Go 程序诊断分析工具
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • Javascript基础之Array数组API
  • js数组之filter
  • SQLServer插入数据
  • Vue 重置组件到初始状态
  • 翻译--Thinking in React
  • 后端_ThinkPHP5
  • 聚类分析——Kmeans
  • 理清楚Vue的结构
  • 聊聊redis的数据结构的应用
  • 实现简单的正则表达式引擎
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 温故知新之javascript面向对象
  • 消息队列系列二(IOT中消息队列的应用)
  • 写给高年级小学生看的《Bash 指南》
  • 一个完整Java Web项目背后的密码
  • 一文看透浏览器架构
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • !!java web学习笔记(一到五)
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (day6) 319. 灯泡开关
  • (二)PySpark3:SparkSQL编程
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (十一)c52学习之旅-动态数码管
  • .Net Core和.Net Standard直观理解
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .Net各种迷惑命名解释
  • .Net面试题4
  • .net网站发布-允许更新此预编译站点
  • []Telit UC864E 拨号上网
  • [20140403]查询是否产生日志
  • [20170713] 无法访问SQL Server
  • [2023年]-hadoop面试真题(一)