乱码问题由来已久。网上也有很多解决方案。但是很多问题都是泛泛而谈。不能解决根本问题。而且很多方案相信写的人都没有试过,只是假想这个方案可以。
见:http://community.csdn.net/Expert/topic/5006/5006422.xml?temp=.1805384
http://yesun.cnblogs.com/archive/2006/06/20/430693.aspx
比如: tomcat5.5, jdk1.5,ie6.0下, server.xml配置如下:
<Connector port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" useBodyEncodingForURI="true" URIEncoding="UTF-8" />
有一个test.jsp, 编码和保存方式均为:UTF-8,过滤器也设置成UTF-8
<form action="test.jsp" method="post">
输入中文:<input type="text" name="q"><input type="submit" value="确定">
<br/><a href="javascript:getM();">通过get方式提交</a>
</form>
</BODY>
</HTML>
<script language="javascript" >
function getM()
{
window.open('test.jsp?a=<%= java.net.URLEncoder.encode("你","UTF-8")%>&a1=<%= java.net.URLEncoder.encode("你")%>&q='+escape(document.all.q.value)+"&q1="+document.all.q.value+"&q2="+encodeURI(document.all.q.value),"_self");
}
这是,如果再输入框内输入“你”这个字,提交时时乱码(经我测试,输入奇数个汉字,最后一个总是乱码),再浏览器窗口直接输入“你”,也是乱码。 而如果,采用firefox,一切正常,或者在ie6.0下,全部用gbk编码,则一切正常。
测试得知: “你”的UTF-8编码: E4 BD A0, GBK编码:C4 E3, UNICODE编码 4F60
在所有都设置成UTF-8的情况下:通过输入框输入“你”,则提交到服务器上的byte是: E4 BD,最后一个AO被IE给无缘无故的截去了。 而如果通过浏览器地址栏输入“你”,则实际提交的是 GBK编码: C4 E3。java.net.URLEncoder.encode默认是按照 系统编码,而不是你的文件的编码。 escape是安装unicode编码,encodeURI是安装UTF-8编码。
所以到此时,乱码原因已经全部找到。解决起来就容易了。