通过链接传递参数值是中文时,会有2个问题:(页面采用UTF-8格式)
1》中文乱码,在action接值时转码即可(使用new String(str.getBytes("iso-8859-1"),"UTF-8"))
2》传递的中文参数后面还有其他参数,此时页面:
查询 其中:
查询条件search_name=“张三”,后面nPageNo=1;当action接值时,request.getParameter("search_name")取到的值是:“张三的乱码“nPageNo=1 看了网上很多帖子,自己实践了一下,改为如下:页面:
(不要使用EL语言,使用jsp脚本)
<% String search_name = request.getParameter("search_name");
if(search_name != null ){ //把汉字进行编码 search_name = URLEncoder.encode(search_name,"UTF-8");
}
%>
查询 action接值:
String search_name= this.getRequest().getParameter("search_name");
if (search_name != null ) { search_name = new String(search_name.getBytes("iso-8859-1"),"UTF-8");
分析了一下原因:
tomcat默认的编码格式iso-8859-1,request取值时编码格式变了,由于中文变乱码,故把&nPageNo=1也取到了;所以在页面把传的中文参数转为UTF-8格式,在取的action中把iso-8859-1格式的中文再转成UTF-8格式,中文问题就解决了.
文件1:encode.jsp <%@ page language="java" c pageEncoding="GBK"%><% String sFileName = "中文文件名.doc";
sFileName = java.net.URLEncoder.encode(sFileName);//代码行1 %>
decode
文件2:decode.jsp <%@ page language="java" c pageEncoding="gbk"%>
<% String sFileName = request.getParameter("filename"); sFileName = java.net.URLDecoder.decode(sFileName,"GBK");
//代码行3 out.println("filename:"+sFileName); %>看上去,这样肯定可以达到要求了,但是事实不是这样,javascript并不识别jsp编码后的字符串:用鼠标移动到链接上方时,可以看到IE状态栏上的确是正确的编码,即"�����ļ���.doc"
然而要注意的是:用鼠标右键点击链接-〉属性看到的URL是javascript:decode('?D?????t??.doc');后果可想而知,转向后输出的是乱码。弄了半天,转UTF-8也是一样,一个小问题整的很郁闷,最后想到,还得在js这里下手。把encode.jsp代码行1注释掉,代码行2前面加入一行:
filename = encodeURI(filename);
看到一点进展:转向后的url已经很规范了:
filename=中文文件名.doc,但是结果仍然是乱码。为啥呢?注意观察,前面的编码和后面是不一样的!然而,javascript的EncodeURI没有提供编码参数,默然就是UTF-8. 好,那么 sFileName = java.net.URLDecoder.decode(sFileName,"UTF-8");行不行呢?
答案是:不行,原因我现在还没找到,找到了会在此补充,如果哪位知道,还望指点。解决办法:把代码行3替换成 sFileName= new String(sFileName.getBytes("ISO-8859-1"), "UTF-8"); 现在再看结果,已经是正常的中文了。
补充:Ajax中,servlet输出中文之后,需要js读取,同样面临编码问题,可以采取如下方式:在servlet中用URLEncoder编码sText = URLEncoder.encode(sText,"UTF-8"); 在js中用decodeURI解码xText = decodeURI(xText);