javascript ajax提交数据中文乱码解决办法

一个UTF8页面需要POST数据到GB2312页面,这时中文的编码是按照UTF8提交过去的,GB2312页面无法接收。如何实现,网络搜索了一种很不错的方法,但有缺陷,这里一一说起。

1、FORM标签里加上accept-charset代码,这个能把FORM里的数据自动编码成指定的字符集提交,比如在UTF8页面提交数据到GB2312,代码就是accept-charset=”GB2312″,但accept-charset除了IE其他浏览器都支持。。。

2、这时可以在提交时触发JS,document.charset=’GB2312′;,用这段代码设置当前页面编码为GB2312。到这里看似很完美了,但还一个问题,就是触发这个代码后,当前页面刷新之后会乱码,这是因为你刚才改变了当前页面的编码。

3、怎么处理刷新后乱码呢,就是要加以判断,判断当前页面编码和默认的编码是否一致,如果不一致则刷新,

 代码如下 复制代码

if(isIE && document.charset!=”utf-8″)location.reload(false)

4、网上的介绍最多到这步,但是我却发现,这样就步入了一个死循环,因为第2步已经改变了编码,您在当前页面不管怎样刷新,还是改变后的编码,所以一定要重设这个编码才行,代码就是这样的。

 代码如下 复制代码

if(isIE && document.charset!=”utf-8″){
document.charset=’utf-8′;
location.reload(false);}

代码综合起来如下:
判断当前页码是否为UTF8,如果不是,则设定编码为UTF8并刷新,避免乱码。

 代码如下 复制代码

var isIE=!!window.ActiveXObject;
if(isIE && document.charset!=”utf-8″){
document.charset=’utf-8′;
location.reload(false);}

设定FORM的accept-charset,让非IE浏览器直接提交编码后的数据到其他页面

 代码如下 复制代码

<form accept-charset=”GB2312″>

提交数据时触发修改当前页面编码的JS

 代码如下 复制代码

onsubmit=”if(isIE)document.charset=’GB2312′”

实例

方法其实很简单:

比如页面表单(form)代码如下:

 代码如下 复制代码

<form name="formname"method="post" action="">
……
</form>

只需要在该页面增加javascript函数,比如:

 代码如下 复制代码

function functionname()
{
document.charset="gb2312";
formname.submit();
}

最后,将这个函数增加到form的onsubmit中即可。即:

 代码如下 复制代码

<form name="formname"method="post" action="" onsubmit=“functionname();”>
……
</form>

让我们先看一下AJAX 的经典请求代码

 代码如下 复制代码

xmlhttp.open( "post", url, async );
xmlhttp.setRequestHeader( "Content-Type", "text/html" );
xmlhttp.send( params );

通过前面的说明,不知道你现在看出端倪了没有。不知道是受了网上教程的影响还是其它方面影响,setRequestHeader 并是万年不变的,也没人想过去改它,而问题就正好出在这个地方。回想一个JSP 页面内容的编码设置,其中有这么一节:

 代码如下 复制代码

contentType="text/html; charset=UTF-8"

现在知道问题了吧,所以我们要把第二句代码改为:

 代码如下 复制代码

xmlhttp.setRequestHeader( "Content-Type", "text/html;charset=UTF-8" );

如果提交的是form ,那么设置为

 代码如下 复制代码
"application/x-www-form-urlencoded; charset=UTF-8"

最后别忘了在返回数据时也设置上:

 代码如下 复制代码

response.setContentType( "text/xml" );
response.setCharacterEncoding( "UTF-8" );

如果要问为什么的话,其实我们可以把xmlhttp 看成是一个临时页面,它由浏览器动态生成,主要作用是在后台获得请求的数据(可以看成是一个高级的iframe )。所以对于普通页面设置的编码,对它也要同样设置。而在servlet 中返回数据为什么要设置contentType 和encoding 其道理也是一样的。众所周知,jsp 的最后形态就是servlet ,而jsp 页首设置的那个内容其实也就是让生成的servlet 中生成这么两句话:

 代码如下 复制代码

response.setContentType( "text/html" );
response.setCharacterEncoding( "UTF-8" );

而pageEncoding 则是跟jvm 说明了这个页面的内容要使用什么编码保存(这跟之后生成的CLASS 有关系)。所以在servlet 设置response 的编码也是理所当然的了。

 代码如下 复制代码

response.setContentType("text/xml;charset=UTF-8");

response.setHeader("Pragma", "no-cache"); //HTTP 1.0

response.setDateHeader("Expires", 0); //prevents caching at the proxy server

PrintWriter out = response.getWriter();

out.write(outXML);

out.flush();

out.close();

OK !这样向客户端写的数据中的中文也是UTF-8 编码了,客户端js 脚本获取到request.responseXML 也好,responseText 也好,里面的数据都不会有乱码了

 

7)解决json在后台传递中的乱码:

 a.Action:

 代码如下 复制代码

  PrintWriter out = response.getWriter();
          out.print("啊");

 

 b.action:

 代码如下 复制代码

  BufferedReader bf = new BufferedReader(new InputStreamReader(httppost.getResponseBodyAsStream()));

 

这里得到的bf.readline会是乱码,解决办法为:

在a.Action中 PrintWriter out = response.getWriter(); 前面加上

 代码如下 复制代码

response.setCharacterEncoding("UTF-8");

在b.Action中修改为

 代码如下 复制代码

BufferedReader bf = new BufferedReader(new InputStreamReader(httppost.getResponseBodyAsStream(),"UTF-8"));

总结
其实我们只要页面与保存数据页面编码统计就是了,同时ajax默认提交数据编码为utf-8的,如果你是GBK的页面我们只要把发送编码修改一下即可。

中文乱码原因在于javascript使用的是UTF-8国际编码,UTF-8每个汉字用4个字节来存储。而我的页面和数据库都用GB2312编码,这就造成了AJAX send数据的时候出现中文乱码的问题

时间: 2016-11-14

javascript ajax提交数据中文乱码解决办法的相关文章

http-c++ post提交数据中文乱码

问题描述 c++ post提交数据中文乱码 vc6.0 mfc 客户端用post提交中文数据,在web服务端接收是乱码,初步分析是编码问题,如果将中文转换成utf-8发送,则服务端能正常接收中文. 测试时我是借用的浏览器将中文转换成utf-8的,然后用转换后的字符串直接提换中文. 比如: 一:PostHttpPage("0.citygo.duapp.com","orderfrom_new","clientName=中文"); 二:PostHttp

远程linux中文乱码解决办法

使用xshell登录中文版CentOS或者redhat时,在xshell下如果输出的是中文的话可能会显示乱码,通过如下办法可以有效的解决乱码问题 linux中文乱码解决方法如下: [root@localhost ~]# cd /etc/sysconfig/ [root@localhost sysconfig]# cp i18n i18n.bak #备份i18n文件 [root@localhost sysconfig]# echo "" >i18n [root@localhost

Ajax在IE浏览器会出现中文乱码解决办法

在AJAX浏览器来进行发送数据时,一般它所默认的都是UTF-8的编码. Ajax在IE浏览器会出现中文乱码的情况!解决办法如下 <script type="text/javascript"> function showDiv(str){ document.getElementById("picDiv").style.display=""; var xmlhttp; if (str==""){ document.ge

PHP中文乱码解决办法[转]

一.首先是PHP网页的编码 1.     php文件本身的编码与网页的编码应匹配 a.     如果欲使用gb2312编码,那么php要输出头:header("Content-Type: text/html; charset=gb2312"),静态页面添加<meta http-equiv="Content-Type" content="text/html; charset=gb2312">,所有文件的编码格式为ANSI,可用记事本打开

IntelliJ IDEA中文乱码解决办法

1. 预热 刚刚接触IntelliJ IDEA几天,在易用性方面的确比Eclipse好很多,比较智能,各种插件.工具都已经集成,和Mac OS X类似--开箱即用,并且在试用了之后在开源中国三折(后悔2折的时候没有下手)购买了授权. 但是还是老大难问题--中文乱码,让我不得不花费了一些时间去折腾它,这一点就不如Eclipse了,没有遇到过乱码问题. 乱码问题表现在使用Web Server(Tomcat.Jetty)时输出日志或者直接System.out.println("中文字符")时

oracle 中文乱码解决办法

---- 在国内外大中型数据库管理系统中,把ORACLE作为数据库管理平台的用户比较多.ORACLE 不论是数据库管理能力还是安全性都是无可非议的,但是,它在汉字信息的显示方面着实给中国用户带来不少麻烦,笔者多年从事ORACLE数据库管理,经常收 到周围用户和外地用户反映有关ORACLE数据库汉字显示问题的求援信,主要现象是把汉字显示为不可识别的乱码,造成原来大量信息无法使用.本文将就这一 问题产生的原因和解决办法进行一些探讨,供存在这方面问题的用户朋友参考. ---- 1.原因分析 ----

Sublime text 3中文乱码解决办法

  1.打开Sublime Text 3,按windows:Ctrl+-;mac:control+~打开控制行,复制粘贴以下python代码,然后回车运行. import urllib.request,os,hashlib; h = '7183a2d3e96f11eeadd761d777e62404e330c659d4bb41d3bdf022e94cab3cd0'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_p

ajax获取数据中文乱码问题最简单的完美解决方案_AJAX相关

使用scriptCharset即可解决问题,用contentType就不一定可以了. 复制代码 代码如下: $.ajax({       url: testUrl,       dataType: 'jsonp',       type: 'post',       scriptCharset: 'utf-8'     }); 上面的解决方案是最完美的,另外也附上网上的解决方式吧,是用contentType来处理的 复制代码 代码如下: jQuery(form).ajaxSubmit({ url

解决Ajax加载JSon数据中文乱码问题

一.问题描述 使用zTree的异步刷新父级菜单时,服务器返回中文乱码,但项目中使用了SpringMvc,已经对中文乱码处理,为什么还会出现呢? 此处为的异步请求的配置: Java代码 async: { enable: true, url: basePath + '/sysMenu/listSysMenu', autoParam: ["id=parentId"] } SpringMvc中文字符处理: Java代码 <mvc:annotation-driven> <mvc

ajax中文乱码解决

ajax|解决|中文|中文乱码 解决AJAX传送中文会导致乱码的问题 //如果传送参数是直接赋予的,就会产生乱码!http_request.open("POST",url,true); http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); http_request.send("action="+strName+"&val="+