MyException - 我的异常网
当前位置:我的异常网» Java Web开发 » 关于字符编码与解码的几个小问题,希望大家一起讨论

关于字符编码与解码的几个小问题,希望大家一起讨论(2)

www.MyException.Cn  网友分享于:2015-08-27  浏览:29次

< filter-name > Set Character Encoding </ filter-name > 
< url-pattern > *.htm </ url-pattern > 
</ filter-mapping > 
的,有用
<% request.setCharacterEncoding( " GBK " ); %> 
的,还有用
<% @ page contentType = " text/html; charset=GBK " pageEncoding = " GBK " %> 
的,还可以用
<% String name = new String(request.getParameter( " name " ).getBytes( " 8859_1 " ), " GB2312 " ); %> 
在做项目的过程中,发现用URL传request参数的时候,在第二个页面上得到乱码的问题。把上面几种方法都试了一下还是不行。仔细追踪了一下,发现在页面的源代码上中文是正常的,一直到URL还是中文正常,可是在后台的Action里面log出来就成了乱码了,于是猜想是在request封装的过程中把中文变成乱码了,以致于后台直接就是取到的乱码。在后台Action中Set入中文,页面上正常显示,说明Struts的中文已经不存在问题。剩下的,应该就只有doGet和doPost方法的问题了。找了一下tomcat的配置文件,发现只要在server.xml中:
<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 --> 
< Connector port ="8080" maxHttpHeaderSize ="8192" 
maxThreads ="150" minSpareThreads ="25" maxSpareThreads ="75" 
enableLookups ="false" redirectPort ="8443" acceptCount ="100" 
connectionTimeout ="20000" disableUploadTimeout ="true" /> 
<!-- Note : To disable connection timeouts, set connectionTimeout value
to 0 --> 
改为
<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 --> 
< Connector port ="8080" maxHttpHeaderSize ="8192" 
maxThreads ="150" minSpareThreads ="25" maxSpareThreads ="75" 
enableLookups ="false" redirectPort ="8443" acceptCount ="100" 
connectionTimeout ="20000" disableUploadTimeout ="true" URIEncoding ="GBK" /> 
<!-- Note : To disable connection timeouts, set connectionTimeout value
to 0 --> 
就是加上URIEncoding="GBK"就万事大吉了。
至此,应该再困难的乱码问题都解决了吧。就是要在页面上、数据库中、request里、doGet、doPost方法里面都是中文!

------解决方案--------------------
sf?
------解决方案--------------------

------解决方案--------------------
问几个问题:
一、.java文件的字符集编码会对文件中的字符串产生影响吗?
二、String s = "abc"; 这里的abc的字符集是跟操作系统的字符集编码一致还是JVM的?
三、如何将servlet的response.getWriter().print(xml);输入的到界面的字符集改成UTF-8,以前遇到过的,怎么转换最后还是ANSI的(就是在页面点查看源代码,然后另存为可以看见当前的字符集编码格式)

------解决方案--------------------
的确比较全面的编解码问题,我的理解:

1.无论是post还是get都是按页面的编码进行提交,即pageEncoding。如果pageEncoding属性存在,那么JSP页面的字符编码方式就由pageEncoding决定,否则就由contentType属性中的charset决定;如果charset也不存在,JSP页面的字符编码方式就采用默认的ISO-8859-1。后台处理完成后以charset设定的编码方式返回给JSP页面。
未设定时,pageEncoding和charset默认都是ISO-8859-1。

2.第一个问题中已经说清楚了,在程序里获取的参数就是以pageEncoding方式编码的内容。

3.除非你手动调用,否则不会进行URLEncoder.encode()或URLDecoder.decode(),具体过程还是见第一个问题。

4.如果设置了过滤器,只能对post方式提交的数据自动转码;如果在server.xml中设置了URIEncoding,只能对get方式提交数据自动转码。如果这两项都没有设置,需要时可以手动进行转码。

5.s = new String(s.getBytes("UTF-8"), "GBK");即可。
------解决方案--------------------
探讨
谢谢yinyuan1987.

1.既然web服务器接收到的是字节序列,那么这个字节序列应该是通过字符串的getBytes()方法转化的吧,那么在这里转化的时候采用的是什么编码呢?系统默认的还是?

2. <%@ page contentType="text/html; charset=GBK" %>
着句的意思是设置http响应头,提示浏览器使用的字符编码,同时设置http响应(response)的字符编码。
没错,这是提示浏览器使用的什么字符编码,那么提交的参数会产生这种编码…

------解决方案--------------------

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有