火狐浏览器中文乱码

        由于种种原因,LZ项目组中一直使用GBK编码,这个属于历史遗留问题。往常遇到中文乱码问题,基本都是采取页面编码,java端解码的方式进行,费时且费力,需要对中文字段进行特殊处理。

        近期,web端需要进行UI升级,全面使用html5的页面进行升级开发,浏览器版本也从原来的仅支持IE一款,发展为火狐和谷歌一同使用,版本测试期间发现了火狐浏览器的中文乱码问题,所有浏览器url地址栏出现中文参数的http请求,传递到java端参数都面目全非。仔细研究发现,原来是火狐浏览器对于get请求的URI默认使用UTF-8编码,而我们系统中tomcat服务器server.xml的配置为GBK编码,因此产生乱码,使用场景如:window.open、window.location.href等js方式的页面跳转,以及form表单的get方式提交。

问题解决的过程中,一共尝试了三种解决方案,列举如下:

解决方案一:需要修改所有jsp页面编码配置,最彻底的解决方案,但是需要测试人员全局进行验证。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<Connector acceptCount="50" connectionTimeout="20000" enableLookups="false" maxThreads="100" port="12345" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
经测试,jsp和server.xml同时修改为UTF-8编码,中文乱码问题解决。
解决方案二:
使用post方式提交并弹出新页面,增加方法openWindowWithPost,采用此方法,提交的新页面中地址栏没有参数列表,更加简洁且安全,代码如下。
/*
* post方式打开新窗口
*@param url  open窗口要打开的地址
*@param data 参数对象
*@param windowType 1新页签,2弹出窗口
*@param windowParam 打开窗口的参数,例如status=yes,toolbar=no,menubar=no,location=no,width=,height,top=,left=
*/
function openWindowWithPost(url,data,windowType,windowParam)
{  
	if($("#hideform").length > 0)
	{
		$("#hideform").remove();
	}
	$(document.body).append('<form action="" method="post" id="hideform"></form>');
	for(var i in data)	
	{
		$("#hideform").append('<input type="hidden" id="'+i+'" name="'+i+'" value="'+data[i]+'"/>');
	}
    $("#hideform").attr("action",url);      
    var toDay =  new Date();    
    windowname="win"+toDay.getTime();
	window.open(windowType == 1 ? "about:blank" : "_blank",windowname,windowParam);  
    $("#hideform").attr("target",windowname);  
    $("#hideform").submit();      
}
使用方法也很简单,案例如下:
var data = {};
data["param1"] = "aaa";
data.param2 = true;
data.param3 = 100;
openWindowWithPost(url,data,1,"");
解决方案三:
前后台编解码的方式,增加工作量,对中文参数需要特殊处理。
encodeURIComponent(param1)
public static String decodeStr(String sourceStr)
{
	if(!StringUtil.IsEmpty(sourceStr))
	{
		try
		{
			sourceStr = URLDecoder.decode(sourceStr, "UTF-8");
		}
		catch (UnsupportedEncodingException e)
		{
		}
	}
	return sourceStr;
}

相关推荐