问题
在现有主站中使用的是是GBK编码的,当表单使用form submit方式递交的话没有问题,服务器端能够正确识别字符编码。但是,当客户端使用ajax的方式递交表单的话,服务器端识别客户端递交的表单的内容,当内容中有中文字符的话就会出现乱码现象。
原因分析
究其原因,其实很简单,使用ajax方式提交的表单是用utf-8编码来提交的,这样服务器端在接收客户端表单的内容的时候还是按照GBK或其他编码方式来解析的,自然解析出来的内容会出现乱码了。
表单内容可以通过GET或POST方式发送,但是用这两种方式有几个不同之处,对“你好”调用javascript函数encodeURI()解析之后得到的字符串为“%E4%BD%A0%E5%A5%BD”,需要注意的一点,encodeURI()这个函数只会对字符串进行utf8编码。当客户端把“%E4%BD%A0%E5%A5%BD”这段字符串通过GET或者POST方式发送会发生什么事。
1.GET方式
当用get方式提交表单,在服务端的tomcat服务器中会用一个connector来自动解析编码之后字符串,以下是connector的配置节点:
上面配置中有一个属性URIEncoding="GBK"的作用是,当客户端get发送信息中有encode模式的字符串就是用gbk来decode它。和遗憾,主站服务器中的URIEncoding属性是gbk不能变了,而客户端encodeURI()只能编码UTF-8的字符。所以,用这种方式发送的字符串在服务器端就会出现乱码现象。
2. POST方式
当客户端发送“%E4%BD%A0%E5%A5%BD”字符串时,是通过YAHOO.util.Connect这个控件来发送的,如果客户端能正常地发送“%E4%BD%A0%E5%A5%BD”这个字符串,服务端接收到之后并不会做额外的转义,但是YAHOO.util.Connect 将encode之后字符串传给Connect控件之后,这个控件在内部会将encode之后的字符再decode之后再发送,因为发送的是utf-8格式的内容,所以服务器端就会出现乱码。
解决办法
尝试了以上get和post方式之后,觉得在请求的URL上发送数据乱码问题的解决方案比较麻烦,况且,http协议中已经明确说了get和post的区别,get是从服务器端拿一些东西,而post是向服务器传输东西。get方式向服务器端发送数据的数据量有限,且get传输也是不安全的。
那么我们只能来解决YAHOO.util.Connect这个控件发送请求之前自动转义字符的问题。以下是Connect发送异步请求的一段代码
如上所示,可以调用两遍encodeURI,
例如:“你好”
·调用一遍encodeURI:“%E4%BD%A0%E5%A5%BD”
·调用两遍encodeURI: “%25E4%25BD%25A0%25E5%25A5%25BD”
当把第二遍encode的结果传给YAHOO.util.Connect控件,控件会decode成第一遍调用encodeURI的输出结果,这样就能把“你好”的utf-8编码传输到服务器上去了。
在服务器的webwork的action或者interceptor中先对传输上来的内容做一次decode,注意一定要用utf-8解码。示例代码如下:
总结
通过以上提到的在客户端中将用ajax递交的字段内容两次调用encodeURI的方法,能够很好地解决服务器端使用非utf8的而造成的乱码问题。
出现这样的问题,主要原因是客户端javascript的编码只支持utf编码,而服务器端能够按照架构师的需要定义各种编码,口碑现在服务器端使用的是GBK的编码格式,但是随着业务扩展,某些应用模块使用了utf的编码格式,这样在服务器端由于编码不统一,在做两个不同编码的格式系统的产品的时候给程序员带来了无尽的烦恼。例如,sa同时经常会问这样的问题,调用数据库的应用有用gbk编码的,也有用utf8编码的,那么数据库应该用啥编码的呢?
最近口碑的工程师们为现在一直为到底是用gbk编码还是用UTF8编码在进行讨论,我们现在讨论的焦点似乎是哪个编码更加好。但是我觉得,就编码来说扩展性当然是utf8,如果以后口碑要打入国际市场,到时候要出一个阿拉伯语版本的应用时候就可以轻松搞定了。我倒是觉得讨论那个编码好没有什么实际意义,关键是如何解决现在编码混乱的局面,如何让编码统一,这个才是我们应该关注的焦点。这样在将来的项目中我们的工程师不再会因为编码问题而头痛了。
所以我的个人观点是,当你开始搭建一个新的系统的时候,一开始就把utf-8作为你的项目中使用的编码格式,并且要把这个成为你项目的规约,写进你们项目组的“宪法”中去。这样,在以后会为你免去很多不必要的麻烦。
分享到:
相关推荐
在IT领域,特别是Web开发中,遇到“Ajax提交乱码”的问题是非常常见的,尤其是在处理中文或其它非英文字符集时。根据给定的文件信息,我们可以深入探讨如何使用Jquery来解决这一问题。 ### Ajax提交乱码问题的本质 ...
1. **发送表单数据时中文乱码**:当通过Ajax发送含有中文字符的表单数据时,如果没有正确的编码,接收端解析时就会出现乱码。 2. **接收服务器响应时中文乱码**:服务器返回的数据中包含中文字符时,如果客户端没有...
本示例主要涉及如何使用AJAX来提交表单,并解决在提交中文数据时可能出现的乱码问题。 首先,我们了解AJAX的基本结构。一个基本的AJAX请求通常包括以下几个步骤: 1. 创建XMLHttpRequest对象:这是AJAX的核心,...
本文将深入探讨如何利用AJAX(Asynchronous JavaScript and XML)技术来解决这一常见的乱码问题。 ### 一、理解乱码产生的原因 在Web应用中,乱码问题通常发生在以下几个环节: 1. **表单提交**:当用户在网页上...
中文乱码问题在Web开发中是一个常见的挑战,特别是在使用Ajax进行异步数据提交时。通过正确使用URL编码或选择合适的参数传递方式,可以有效地解决这一问题。在实际应用中,开发者应当根据具体情况选择最合适的方法,...
在进行Ajax开发的过程中,经常会遇到一个令人头疼的问题:表单提交的数据出现乱码。这个问题主要出现在客户端与服务器端编码不一致的情况下,导致数据传输过程中字符集转换错误。下面将详细介绍出现乱码的原因以及...
在前端,当用户提交包含中文字符的数据时,为了防止乱码问题的发生,我们通常会在发送AJAX请求之前对这些数据进行编码处理。这里提供了一种常见的方法——使用`encodeURI`或`encodeURIComponent`函数。 ##### 使用...
在使用MyEclipse开发工具进行Web应用开发时,尤其是采用ExtJS框架结合Ajax技术进行前后端数据交互的过程中,可能会遇到一个常见的问题:即通过Ajax发送带有中文字符的数据时,后端接收到的数据出现乱码现象。...
在使用Asp进行Web开发过程中,通过JQuery的AJAX方法提交表单数据时,中文字符很容易出现乱码问题。为了解决这个问题,我们可以使用Asp自带的unescape()和escape()函数来进行编码和解码操作,以此确保数据在客户端与...
我是在一个jsp页面有一个保存按钮,点击时会触发saveForm()的js函数,在saveForm()函数里经过校验后,会通过ajax发送数据请求,这样就不用通过提交表单来传输数据了,ajax估计就是这样的好处吧,目前对ajax还不太...
2. **Ajax POST/GET请求**:异步请求中传递的数据可能会遇到乱码问题。 3. **自动加载**:页面自动获取数据时,如JSONP或Websocket通信。 4. **发送连接请求**:如HTTP GET请求的URL参数或POST请求的Body内容。 ...
本文将深入探讨jQuery中的Ajax过滤器及其在Ajaxform表单提交中的应用,以及如何解决可能出现的乱码问题。 首先,让我们理解什么是jQuery Ajax过滤器。在jQuery中,`ajaxSend`、`ajaxComplete`、`ajaxSuccess`、`...
1. **表单提交**:用户在前端页面填写含有中文的信息并提交到服务器。 2. **Ajax请求**:通过Ajax技术从前端向后端发送含有中文的数据。 3. **URL参数传递**:在URL中传递含有中文的参数。 #### 二、问题分析 乱码...
EXT异步提交FORM表单的核心是通过Ajax技术实现表单数据的后台提交,而无需刷新整个页面。这种方式的主要优点在于能够提供更加流畅的用户交互体验,同时减少了服务器端的负载压力。 ##### 2.2 实现步骤 1. **初始化...
这样,无论是表单提交还是AJAX请求,都能够保证使用正确的编码来传递数据,从而避免乱码的产生。 总结来说,要解决JSP中AJAX GET请求的中文乱码问题,需要从服务器配置和代码实现两方面入手。服务器配置方面,需要...
### AJAX POST 与 GET 提交的区别详解 #### 一、GET与POST基本概念及应用场景 ...此外,在使用AJAX技术进行网络请求时,还需要特别注意编码问题,确保客户端和服务器端的编码一致,以避免乱码问题的发生。
本文将探讨如何使用AJAX技术解决UTF8编码的表单提交到GBK编码脚本时出现的乱码问题,以及如何处理不同编码的表单数据在同一个页面上的汇总。 首先,了解基本的编码知识是必要的。GBK是基于GB2312的汉字编码标准,它...
此外,数据库连接、表单提交等环节也可能因为编码设置不当而导致乱码。 #### 二、解决中文乱码的通用策略 1. **确保全局字符集一致性**:在整个应用中统一使用一种字符集(如UTF-8),包括前端页面、后端代码以及...
### AJAX表单提交知识点解析 #### 一、背景与需求 根据给定的文件信息,本次分享的主题是关于“利用AJAX技术实现表单提交”的一个具体实例。该实例主要针对网友提出的关于如何通过AJAX进行表单提交的需求。本文将...
// 发送AJAX请求或更新表单数据 }); ``` - **服务器端Java**: ```java protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String ...