oyjpArt ACM/ICPC算法程序设计空间

// I am new in programming, welcome to my blog
I am oyjpart(alpc12, 四城)
posts - 224, comments - 694, trackbacks - 0, articles - 6

Tomcat JSP Web 开发中的乱码问题小结

Posted on 2008-05-22 11:26 oyjpart 阅读(1624) 评论(0)  编辑 收藏 引用 所属分类: 程序设计
Tomcat JSP Web 开发中的乱码问题小结
1. 静态页面的乱码问题
文件的编码和浏览器要显示的编码不一致。
1) 检查文件原始的编码, 可以用记事本打开, 然后选择另存为来看;
2) 给当前页面加入一个指令来建议浏览器用指定的编码来显示文件字符内容.
<meta http-equiv="content-type" content="text/html; charset=GBK">
3) 如果系统是英文XP,没装东亚字符集支持, 也会显示乱码.
2. JSP 页面的乱码问题
1) page 指令有个 pageEncoding="GBK" 这个会指定当前页面保存的编码, 如果写成
ISO8859-1 就不能保存汉字;
2) page 指令的 contentType="text/html; charset=ISO8859-1" 也会像静态页面一样让
浏览器来优先选择一种编码.
如果JSP 乱码的话,一般就显示成?,而且不管你给浏览器选什么样的编码,它都不能正
确显示
3. 表单提交的乱码问题(Tomcat 特有)
1). POST 的乱码
MyEclipse 6 Java 开发中文教程
157 刘长炯著
a. 首先浏览器提交表单的编码是根据表单所在页面来决定的, 而不是根据提交后的
JSP 页面的编码来决定的. 把所有的页面的编码都设置成一样的,例如 GBK.
b. 处理方式就是在获取参数之前设置编码:
request.setCharacterEncoding("GBK");
c. 可以用过滤器的方式来解决, Tomcat 已经带了一个现成的:
apache-tomcat-5.5.23\webapps\jsp-examples\WEB-INF\classes\filters\SetCharacter
EncodingFilter.java
web.xml
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2) GET 方式的乱码
用 setCharacterEncoding() 不能解决. TOMCAT 的一个BUG, GET 方式传送的表单参
数总是用的 ISO8859-1 编码. 我们要把它转成 GBK 方式.
String username = request.getParameter("username");
System.out.println(username);
// 转码, 先取得原始的二进制字节数组
byte[] data = username.getBytes("ISO8859-1");
// 根据新的字符集再构造新的字符串
username = new String(data, "GBK");
小结:
所有的页面(除了最后的 GET 的乱码问题)都用统一的编码(GBK 或者UTF-8), 就不会出现
乱码问题

以上内容为【转】

下面是一个完整的过滤器例子:
package filters;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public class TomcatFormFilter implements Filter {
    
/**
     * Request.java 对 HttpServletRequestWrapper 进行扩充, 不影响原来的功能并能提供所 有的
     * HttpServletRequest 接口中的功能. 它可以统一的对 Tomcat 默认设置下的中文问题进行解决而只 需要用新的 Request
     * 对象替换页面中的 request 对象即可.
     
*/
    
class Request extends HttpServletRequestWrapper {
        
public Request(HttpServletRequest request) {
            
super(request);
        }

        
/**
         * 转换由表单读取的数据的内码. 从 ISO 字符转到 GBK.
         
*/
        
public String toChi(String input) {
            
try {
                
byte[] bytes = input.getBytes("ISO8859-1");
                
return new String(bytes, "utf-8");
            } 
catch (Exception ex) {
            }
            
return null;
        }

        
/**
         * Return the HttpServletRequest holded by this object.
         
*/
        
private HttpServletRequest getHttpServletRequest() {
            
return (HttpServletRequest) super.getRequest();
        }

        
/**
         * 读取参数 -- 修正了中文问题.
         
*/
        
public String getParameter(String name) {
            
return toChi(getHttpServletRequest().getParameter(name));
        }

        
/**
         * 读取参数列表 - 修正了中文问题.
         
*/
        
public String[] getParameterValues(String name) {
            String values[] 
= getHttpServletRequest().getParameterValues(name);
            
if (values != null) {
                
for (int i = 0; i < values.length; i++) {
                    values[i] 
= toChi(values[i]);
                }
            }
            
return values;
        }
    }

    
public void destroy() {
    }

    
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
            ServletException {
        HttpServletRequest httpreq 
= (HttpServletRequest) request;
        
if (httpreq.getMethod().equals("POST")) {
            request.setCharacterEncoding(
"utf-8");
        } 
else {
            request 
= new Request(httpreq);
        }
        response.setCharacterEncoding(
"utf-8");
        chain.doFilter(request, response);
    }

    
public void init(FilterConfig filterConfig) throws ServletException {
    }
}

web.xml中加入如下配置信息
    <filter>
        
<filter-name>TomcatFormFilter</filter-name>
        
<filter-class>filters.TomcatFormFilter</filter-class>
    
</filter>
    
<filter-mapping>
        
<filter-name>TomcatFormFilter</filter-name>
        
<url-pattern>/*</url-pattern>
    
</filter-mapping>


上述都是使用统一的GBK编码,如果想用utf-8编码的话,稍作修改就可以了。
在解决了JSP乱码问题之后,还有一个问题,就是数据库乱码问题。
我使用的数据库是mysql
在hibernate的配置文件中加入
    <property name="connection.useUnicode">true</property>
    <property name="connection.characterEncoding">UTF-8</property>
就算是一整套的中文解决方案了。


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理