Ext Ajax 使用encodeURI 乱码

最近在使用ExtJs进行数据提交进行插入的时候会有乱码,什么都不说直接来段代码:

// 添加点组
var addPointGroup = function(groupName)
{
	Ext.Ajax.request(
	{
		url : pg_servlet + '_addFavoriteGroup?name='
				+ encodeURI(magusEncodeURI(groupName)), method : 'POST',
		success : function(response)
		{
			loadPointGroup();
			Ext.Msg.alert('提示', '添加点组成功!');

		}, failure : function(response)
		{
			Ext.Msg.alert('提示', '添加点组失败!' + response.responseText);
		}
	});
};

magusEncodeURI是内置的转码器,代码如下:

magusEncodeURI = function(text)
{
	text = encodeURI(text);
	text = text.replace(/\+%/g, "%20");
	text = text.replace(/\//g, "%2F");
	text = text.replace(/\?/g, "%3F");
	text = text.replace(/\#/g, "%23");
	text = text.replace(/\&/g, "%26");
	return text;
}

当不使用外面一层的encodeURI时在java后台获取到的一直是乱码。

java后台代码:

public String addFavoriteGroup() throws UnsupportedEncodingException
	{
		ParseParameter pp = ParseParameter.getParser();
		String name = pp.parseString("name", request).toUpperCase();
		try
		{
			fgService.addFavoriteGroup(name);
			JSONObject jo = getSuccessJSON(FavoriteGroupService.FUN_ADDFAVORITEGROUP);
			String result = jo.toString();
			response.setCharacterEncoding("utf-8");
			response.getWriter().print(result);
		}
		catch (Exception e)
		{
			e.printStackTrace();
			return null;
		}
		return TEXT;
	}

其中pp.parseString 代码如下:

public String parseString(String fieldName, HttpServletRequest request)
	{
		String result = request.getParameter(fieldName);
		try
		{
			/**
			 * 将前台 encodeURI 编码的字母解码
			 */
			if (result != null && !"".equals(result.trim()))
			{
				result = java.net.URLDecoder.decode(result, "UTF-8");
				result = converURICode(result);
				result = result.trim();
			}
		}
		catch (UnsupportedEncodingException e)
		{
		}
		return result;
	}

converURICode代码如下:

private String converURICode(String result)
	{
		// 添加URL特殊符号转码支持
		if (result.indexOf("%20") != -1)
		{
			result = result.replaceAll("%20", "+");
		}

		if (result.indexOf("%2F") != -1)
		{
			result = result.replaceAll("%2F", "/");
		}
		if (result.indexOf("%3F") != -1)
		{
			result = result.replaceAll("%3F", "?");
		}

		if (result.indexOf("%23") != -1)
		{
			result = result.replaceAll("%23", "#");
		}

		if (result.indexOf("%25") != -1)
		{
			result = result.replaceAll("%25", "%");
		}
		if (result.indexOf("%26") != -1)
		{
			result = result.replaceAll("%26", "&");
		}
		return result;
	}

converURICode代码的作用和为了解析magusEncodeURI代码的。

使用上面的一套方式完全可以保证传递过来的参数不是乱码了(这个前提是有要求的,你的html或者jsp文件要设置编码格式,或者设置对应filter,要编码格式强转)。

下面说明一下这段代码要注意的地方:

在专递参数的时候要经过两次encodeURI,并且提交的方式最好使用POST,get方式可能会有意想不到的乱码问题。在前端使用什么样的转码在后台都要使用相同的解码方式,对应magusEncodeURI和converURICode,并且经过java.net.URLDecoder.deocde(这个地方要特别注意,网上有很多的例程写的是java.net.URIEncoder.encode,我被坑惨了)进行解码。其他需要注意的地方就是,在前后台一定要使用统一的编码格式,在同一个项目中一定要统一,不然会出现各式各样的乱码问题。

时间: 2024-10-01 04:41:31

Ext Ajax 使用encodeURI 乱码的相关文章

ajax中文出现乱码的问题

ajax中文出现乱码的问题:在使用ajax处理设计中文内容的时候可能会出现乱码的情况,下面介绍一下如何解决此问题:一.提交和接收均为utf-8或gbk编码.二.对提交的数据调用JQuery函数encodeURI进行编码再提交或显示或链接既可.三.url=encodeURI(url); //url为数据. 原文地址是:http://www.softwhy.com/forum.php?mod=viewthread&tid=8027 更多内容可以参阅:http://www.softwhy.com/fo

AJAX的中文乱码问题

/***********本人原创,欢迎转载,转载请保留本人信息*************/作者:wallimn电邮:[email protected]博客:http://blog.csdn.net/wallimn时间:2006-11-15/***********本人原创,欢迎转载,转载请保留本人信息*************/ 今天终于解决了AJAX的中文乱码问题,写篇文章来帮助一下有同样问题的朋友们.我的开发环境:XP, eclipse,使用GB18030编码. 当遇到这个问题时,到网上去查了

ExtJS中Ext.Ajax.request与form1.getForm().submit的基本区别

相同点:都属于Ajax提交方式! 不同点:Ext.Ajax.request是Ext.data.connection的一个实例 form1.getForm().submit是BasicForm的一个实现方式 使用上的区别: 1.form1.getForm().submit常用在表单提交的时候,就是说要提交页面数据,比如新增和修改数据页面 2.Ext.Ajax.request常用在根据参数提交的时候,比如删除,我们把页面选中的ID进行遍历,封装在一个Array中,作为一个参数做Ajax的提交 例子:

SpringMVC中使用@ResponseBody注解返回值,Ajax取得中文乱码解决方法

Spring使用AnnotationMethodHandlerAdapter的handleResponseBody方法, AnnotationMethodHandlerAdapter使用request header中"Accept"的值和messageConverter支持的MediaType进行匹配,然后会用"Accept"的第一个值写入 response的"Content-Type".一般的请求都是通过浏览器进行的,request heade

Ext.Ajax.request同步请求

导读: ajax分为2种,一种是同步,一种是异步同步:代码执行完了之后才执行后面的代码 异步:代码刚执行,后面的代码就马上接着执行了,不管前面的代码是否执行完异步的情况下,要获得返回信息,就需要在异步执行完之后写代码,也就是在success里面写代码,或者success里面调用其他的函数. 在Ext3.0以上的版本里面 ,Ext.Ajax.request是异步的,到Ext 4.0以后才支持同步请求的属性(没试过) -----------------------------------------

Ext中超时设定 ext.ajax.timeout

公司有个小产品,用到ext的ajax功能,后来数据量大了以后,老是报查询超时,经过分析,是默认的超时设置引起的,后来在jsp页面上加上一句 Ext.Ajax.timeout=900000; (超时为十五分钟,单位为毫秒,默认是30秒) 搞定.参考文章 用Ext来研发就必然涉及到前台和后台的数据通讯问题了,也就是通常所谓从后台拿数据了 :这搭面就有一个时间的问题了,那就是前台没可能在那里一直等下去:平时都没寄望这样的问题,不过最近的项目就只患上思量,数据量太大,单查询数据总记录数目都要一分多钟(表

ExtJS Ext.Ajax.request最好设为同步

ExtJS 中Ext.Ajax.request最好设为同步,即async: false,因为如果Ajax后面需要用到Ajax更新的数据的话,设置同步,后面才能用到最新的数据. function GetPatientOrder() { Ext.Ajax.request({ url: '/CommonAshx/Order.ashx', method: 'get', async: false, params: { gurd: "GetOrder", patientCardNo: Ext.ge

Ext.Ajax的用法

Ext.Ajax.request({                                  //ajax请求 url: 'Account/SysArea/InsertRoot',              //请求URL params: record.data.attributes,                 //參数列表 success: function (response) {                  //操作成功回调函数 var _o = Ext.decode

Ext.Ajax的使用方法

Ext.Ajax.request({                                  //ajax请求 url: 'Account/SysArea/InsertRoot',              //请求URL params: record.data.attributes,                 //参数列表 success: function (response) {                  //操作成功回调函数 var _o = Ext.decode