Java/J2EE中文问题终极解决之道 (1)

JSP中文乱码解决办法,过滤器等
 
 Java/J2EE中文问题终极解决之道 
http://www.jdon.com/idea/chinesejava.htm 

关于Java WEB应用的国际化(UTF-8,IOS8859-1,GBK,GB2312)的问题 
http://angues1980.spaces.live.com/blog/ 

Struts中文解决办法 
http://blog.sina.com.cn/u/4a7d6a4d010004ep  

Struts里过滤器的简单使用 
http://cache.baidu.com/c?word=struts%2C%B9%FD%3B%C2%CB%C6%F7%2C%BC%F2%B5%A5&url=http%3A//www%2Ezzbund%2Ecn/viewthread%2Ephp%3Ftid%3D69&b=25&a=17&user=baidu   
 
 
  
 作者: Former   2006-10-17 15:41   回复此发言  
 
2关于Java WEB应用的国际化(UTF-8,IOS8859-1,GBK,GB2312)的问题
 
昨天看到一篇《Java/J2EE中文问题终极解决之道》的文章(http://www.jdon.com/idea/chinesejava.htm),里面提到中文乱码问题的根本解决办法是明确地指定整个应用系统统一的字符集。 
要做到以下几点: 
一、开发和编译代码时指定字符集为UTF-8。JBuilder和Eclipse都可以在项目属性中设置。 
二、使用过滤器,如果所有请求都经过一个Servlet控制分配器,那么使用Servlet的filter执行语句,将所有来自浏览器的请求(request)转换为UTF-8,因为浏览器发过来的请求包根据浏览器所在的操作系统编码,可能是各种形式编码。关键一句: 
request.setCharacterEncoding("UTF-8")。 
网上有此filter的源码,Jdon框架源码中com.jdon.util.SetCharacterEncodingFilter 
需要配置web.xml 激活该Filter。 
三、在JSP头部声明:<%@ page contentType="text/html;charset= UTF-8" %>。 
四、在Jsp的html代码中,声明UTF-8:<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
五、设定数据库连接方式是UTF-8。例如连接MYSQL时配置URL如下: 
jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8 
一般数据库都可以通过管理设置设定UTF-8 
六、其他和外界交互时能够设定编码时就设定UTF-8,例如读取文件,操作XML等。 

但是经过笔者测试还有几个问题文中的方法不能完全解决: 
1.Form里面用GET方法传参时转换的问题; 
2.URL后附带中文传参时的转换问题。 

环境:操作系统WindowsXP SP2(中文),Eclipse 3.1 with Lomboz,tomcat 5.5.9 ,IE 6.0 

一、正常POST方法传参: 
页面a.jsp 
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"%> 
</head> 
<FORM METHOD=POST ACTION="/webtest/b.jsp"><INPUT TYPE="text" NAME="parm"> 
<INPUT TYPE="submit"></FORM> 
</html> 
页面b.jsp 
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"%> 
</head> 
<% 
request.setCharacterEncoding("UTF-8"); 
String strParm = request.getParameter("parm"); 
out.println(strParm); 
%> 
</html> 
没有任何问题。 

二、Form里面用GET方法传参时转换问题的解决方法: 
页面a.jsp 
…… 
<FORM METHOD=GET ACTION="/webtest/b.jsp"><INPUT TYPE="text" NAME="parm"> 
…… 
页面b.jsp 
…… 
String strDisplay = new String(strParm.getBytes("ISO8859-1"), "UTF-8"); 
out.println(strDisplay); 
…… 

分析:根据解决方法判断,可能是在FORM在用GET方法包装参数到地址栏的URL链接时或者是在URL传递前,用的是ISO8859-1的编码(并且所用IE浏览器的高级选项中设置了总是以UTF-8发送URL这项,可以排除是在URL发送后转换的ISO8859-1编码),而这个编码方式的修改好像并不在《Java/J2EE中文问题终极解决之道》文中提到的那几个步骤之中, 

三、URL后附带中文传参时的转换问题的解决方法: 
修改b.jsp页面 
…… 
String strDisplay = new String(strParm.getBytes("ISO8859-1"), "GBK"); 
…… 

分析:根据解决方法判断,URL在传递前,用本地操作系统的默认编码(GBK)把中文编码为ISO8859-1。 

同理,使用Servlet测试(包括建立Filter对请求进行编码转化),结果相同,不再赘述。 

怎样才能用一种方法,一劳永逸地解决这3种情况下中文乱码问题呢? 
1、用获取字符串的编码格式的方法(目前还没找到)来判断后调用各个方法。 
2、还有一个是应用中不用GET方法和URL方法来传递参数。 
3、必须使用GET方法或者URL方法传中文时,首先进行编码转化,比如建立静态文本常量的XXXX.properties文件,事先用JDK自带的active2ascii工具进行转化。 
4、还有就是建立个空白页面包装参数再用POST方法转发。 

 
解决第一个问题的方法: 
如果使用tomcat服务器,可以在tomcat/conf/server.xml里面修改<Connector>加上 
URIEncoding="UTF-8" 
 
最后结论:不要使用url地址栏方式传递中文参数
  
 作者: Former   2006-10-17 15:41   回复此发言  
 
3Struts中文解决办法
 
我以前发表过Struts中文解决问题,那只是在解决Struts资源文件时的中文问题,但要解决把数据库中的数据读出来的中文问题时,就不可以了,现在我在发表一个可以在任何地方都可以使用的Struts的中文问题解决方法
 (1)首先自己要建个类,这个类作为过滤器来用,代码如下,很少也很简单:
 package com.oscar.yava.util;//类的包名

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;

public class xinhuiFilter implements Filter {

 public void init(FilterConfig arg0) throws ServletException {
 // TODO 自动生成方法存根
 }

public void doFilter(ServletRequest request, ServletResponse response,
 FilterChain chain) throws IOException,ServletException {
 request.setCharacterEncoding("gbk");
 chain.doFilter(request,response);

 }
 public void destroy() {
 // TODO 自动生成方法存根

 }

}
(2)然后在Struts的配置web.xml中加入如下一些代码就可以了

 <filter>
 <filter-name>xinhuiFilter</filter-name>
 <filter-class>com.oscar.yava.util.CharFilter</filter-class>
 </filter>
 <filter-mapping>
 <filter-name>xinhuiFilter</filter-name>
 <url-pattern>/*</url-pattern>
 </filter-mapping>
  
 作者: Former   2006-10-17 15:42   回复此发言  
 
4Struts里过滤器的简单使用
 
网上过滤器的使用例子.代码比比皆是.

我这也是一个非常简单.好用的方法.

可供初学者很好的使用!

步骤只要两个:

一是你只要在你的WEB根目录下打开web.xml,然后在父节点加上Filter节点就行.

代码如下:


CODE:[Copy to clipboard]<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>com.yirong.framework.filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
<init-param>
<param-name>ignore</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
二是:把过滤器的代码(如下代码)放在你的工程目录的源代码管理目录中.
比如我这边的目录是:/myweb/src/Beans
(Beans是我自建的包名)


CODE:[Copy to clipboard]package Beans;

import org.apache.struts.action.RequestProcessor;
import javax.servlet.*;
import javax.servlet.http.*;

public class MyRequestProcessor extends RequestProcessor {
public MyRequestProcessor() {
}

protected boolean processPreprocess(HttpServletRequest request,HttpServletResponse response){
boolean cp=true;
String remoteHost=request.getRemoteHost();
if(remoteHost==null || !remoteHost.startsWith("126.")){
cp=false;
try{
response.sendRedirect("iperror.jsp");
}
catch(Exception ex){
ex.printStackTrace();
}
}
System.out.println("--test--");
return cp;
}
}
这样一切都可搞定了.
每次有请求它都有将通过过滤器...
简单又实用.!!
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值