复制装载,以备忘 jsp乱码解决方案( 四 )


phpCE.CN,设计手册

3、表单get提交方式的乱码处理方式 。
如果使用get方式提交中文,接受参数的页面也会出现乱码,这个乱码的原因也是tomcat的内部编码格式iso8859-1导致 。Tomcat会以get的缺省编码方式iso8859-1对汉字进行编码,编码后追加到url,导致接受页面得到的参数为乱码/、 。
解决办法:
A、使用上例中的第一种方式,对接受到的字符进行解码,再转码 。
B、Get走的是url提交,而在进入url之前已经进行了iso8859-1的编码处理 。要想影响这个编码则需要在server.xml的Connector节点增加useBodyEncodingForURI="true"
属性配置,即可控制tomcat对get方式的汉字编码方式,上面这个属性控制get提交也是用request.setCharacterEncoding("UTF-8")所设置的编码格式进行编码 。所以自动编码为utf-8,接受页面正常接受就可以了 。但我认为真正的编码过程是,tomcat又要根据 更改D:Tomcatconfserver.xml,指定浏览器的编码格式为“简体中文”:
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000" useBodyEncodingForURI="true"
disableUploadTimeout="true" URIEncoding=”UTF-8”/> PHPCE.CN,设计手册
里面所设置的URIEncoding=”UTF-8”再进行一次编码,但是由于已经编码为utf-8,再编码也不会有变化了 。如果是从url获取编码,接受页面则是根据URIEncoding=”UTF-8”来进行解码的 。
需要加入的原因大家可以去研究 /webapps/tomcat-docs/config/http.html下的这个文件就可以知道原因了
可以这样验证你的更改是否成功:在更改前,在你出现乱码的页面的IE浏览器,点击菜单“查看|编码”,会发现“西欧(ISO)”处于选中状态 。而更改后,点击菜单“查看|编码”,会发现“简体中文(GB2312)”处于选中状态 。

4、上传文件时的乱码解决
上传文件时,form表单设置的都是enctype="multipart/form-data" 。这种方式以流方式提交文件 。如果使用apach的上传组件,会发现有很多乱码想象 。这是因为apach的先期commons-fileupload.jar有bug,取出汉字后进行解码,因为这种方式提交,编码又自动使用的是tomcat缺省编码格式iso-8859-1 。但出现的乱码问题是: 句号,逗号,等特殊符号变成了乱码,汉字如果数量为奇数,则会出现乱码,偶数则解析正常 。
解决方式: 下载commons-fileupload-1.1.1.jar 这个版本的jar已经解决了这些bug 。
但是取出内容时仍然需要对取出的字符进行从iso8859-1到utf-8转码 。已经能得到正常所有汉字以及字符 。
5、Java代码关于url请求,接受参数的乱码
url的编码格式,取决于上面所说的URIEncoding=”UTF-8” 。如果设定了这个编码格式,则意味着所有到url的汉字参数,都必须进行编码才可以 。否则得到的汉字参数值都是乱码,例如
一个链接 Response.sendDerect(“/a.jsp?name=张大维”);而在a.jsp里面直接使用
PHPCE.CN,设计手册

String name = request.getParameter("name");得到的就是乱码 。因为规定了必须是utf-8才可以,所以,这个转向应该这样写:
Response.sendDerect(“/a.jsp?name=URLEncode.encode(“张大维”,”utf-8”);才可以 。
如果不设置这个参数URIEncoding=”UTF-8”,会怎么样呢? 不设置则就使用了缺省的编码格式iso8859-1 。问题又出来了,第一就是参数值的个数如果是奇数个数,则就可以正常解析,如果使偶数个数,得到最后字符就是乱码 。还有就是如果最后一个字符如果是英文,则就能正常解析,但中文的标点符号仍出现乱码 。权宜之计,如果您的参数中没有中文标点符号,则可以在参数值最后加一个英文符号来解决乱码问题,得到参数后再去掉这个最后面的符号 。也可以凑或使用 。

推荐阅读