Solaris上中文请求乱码
项目概况:
过滤器使用GBK处理中文
对于汉字,使用Post方式没有乱码,使用get方式在Solaris平台上的Weblogic服务器出现乱码。
环境
WinXP+Tomcat5.5.28
OS 名称: Microsoft Windows XP Professional
OS 版本: 5.1.2600 Service Pack 3 Build 2600
没有乱码现象出现。
Solaris平台出现乱码
root@portalA # locale
LANG=zh_CN.GBK
LC_CTYPE=”zh_CN.GBK”
LC_NUMERIC=”zh_CN.GBK”
LC_TIME=”zh_CN.GBK”
LC_COLLATE=”zh_CN.GBK”
LC_MONETARY=”zh_CN.GBK”
LC_MESSAGES=”zh_CN.GBK”
LC_ALL=
root@portalA # uname -a
SunOS portalA 5.10 Generic_120011-14 sun4u sparc SUNW,Sun-Fire-15000
root@portalA #
上中文出现乱码;
解决方法如下:
1、 前台传值的时间,对URL进行编码
2、 后台获取时,采用URLDecoder类进行解码而已
JavaScript 中的处理
function printImag(){
var url = “/JsjxzlpgAction.do?method=queryPrint&yxsh=”+”中文汉字”;
url=encodeURI(encodeURI(url));
window.open(url, ‘数据表’, “location=no,menubar=no,resizable=yes,
scrollbars=yes,status=yes,titlebar=no,toolbar=no”);
}
测试代码:
<html>
<body>
<script type=”text/javascript”>
var url=”/JsjxzlpgAction.do?method=queryPrint&yxsh=”+”中文汉字”;
document.write(encodeURI(url)+ “<br />”);
document.write(encodeURI(encodeURI(url))+”<br />”);
document.write(encodeURI(“,/?:@&=+$#”));
</script>
</body>
</html>
输出如下:
/JsjxzlpgAction.do?method=queryPrint&yxsh=%E4%B8%AD%E6%96%87%E6%B1%89%E5%AD%97
/JsjxzlpgAction.do?method=queryPrint&yxsh=%25E4%25B8%25AD%25E6%2596%2587%25E6%25B1%2589%25E5%25AD%2597
,/?:@&=+$#
encodeURI函数的再一次处理就是对特殊字符,例如%编码成%25
Java 中的处理
String yxsh =
java.net.URLDecoder.decode (request.getParameter(“yxsh”) , “UTF-8″);
使用Java
String str = “/JsjxzlpgAction.do?method=queryPrint&yxsh=” + “中文汉字”;
String encoding = “utf-8″;
String strEnc=java.net.URLEncoder.encode (str, encoding);
System.out .println(strEnc);
System.out .println(java.net.URLDecoder.decode (strEnc,encoding));
输出结果如下:
%2FJsjxzlpgAction.do%3Fmethod%3DqueryPrint%26yxsh%3D%E4%B8%AD%E6%96%87%E6%B1%89%E5%AD%97
/JsjxzlpgAction.do?method=queryPrint&yxsh=中文汉字
进一步测试:
String str2=”%E4%B8%AD%E6%96%87%E6%B1%89%E5%AD%97″;
System.out .println(java.net.URLDecoder.decode (str2,encoding)); str2=”%25E4%25B8%25AD%25E6%2596%2587%25E6%25B1%2589%25E5%25AD%2597″;
System.out .println(java.net.URLDecoder.decode (str2,encoding));
输出结果如下:
中文汉字
%E4%B8%AD%E6%96%87%E6%B1%89%E5%AD%97
可见java.net.URLDecoder.decode (str2,” utf-8”)的本质意义就是将%XX%XX的字符串表示按utf-8来进行解码。
当时冒似是在URL后面带上了这样的参数:
“parm=《%=java.net.URLEncoder.encode(parm,”utf-8″)%>”
然后在JAVA里取出来:
String mytext2 = java.net.URLDecoder.decode(request.getParameter(PARM), “utf-8″);
最终通过这种方式进行了处理。
主要是关注encodeURI函数和URLEncoder和URLDecoder类,来进行数据处理。
Reference
http://bbs.firnow.com/dview37t16452.html
http://hi.baidu.com/%B4%FA%CD%E9/blog/item/b195d554158ba45f574e005e.html
http://www.javaeye.com/topic/456553