随笔-57  评论-202  文章-17  trackbacks-0

      在网上有很多有关Struts的中文解决方案,但是很多都说得很零碎,不够完整。下面是我的一个完整解决方案。
      要使网页能够真正实现多语言,有三个地方都需要修改:
      1.在页面部分,一定要把页面的编码设成UTF-8,就是在开头加上这一句:<%@ page contentType="text/html; charset=UTF-8" %>。并且把所有的文字信息都放到resource文件中。
      以前我在写网页的时候,没有指定页面的编码,总是在获取表单的内容后,要人工的用new String(s.getBytes("ISO8859-1"))转换一下,这样是很繁琐的,而且很容易出错。网页中如果没有指定编码,那么默认的就是用ISO8859-1编码的。
      2.相应的资源文件需要用native2ascii转换一下。
      对于简体中文的资源文件:native2ascii -encoding gbk ApplicationResources_zh.properties convert\ApplicationResources_zh.properties
      对于繁体中文的资源文件:native2ascii -encoding big5 ApplicationResources_zh_tw.properties convert\ApplicationResources_zh_tw.properties

      3.需要用一个filter设置一下request的编码,我的代码如下:

 1import java.io.*;
 2import java.util.*;
 3import javax.servlet.*;
 4import javax.servlet.http.*;
 5
 6/**
 7 * <p>Title: </p>
 8 * <p>Description: </p>
 9 * <p>Copyright: Copyright (c) 2003</p>
10 * <p>Company: </p>
11 * @author George Hill
12 * @version 1.0
13 */

14
15public class CharsetFilter implements Filter {
16
17  private FilterConfig filterConfig;
18
19  /**
20   * Request设置的Charset encoding
21   */

22  private String encoding;
23
24  /**
25   * 是否忽略设置Request的Charset encoding
26   */

27  private boolean ignore;
28
29  //Handle the passed-in FilterConfig
30  public void init(FilterConfig filterConfig) {
31    this.filterConfig = filterConfig;
32
33    encoding = filterConfig.getInitParameter("encoding");
34    String value = filterConfig.getInitParameter("ignore");
35    if ("true".equalsIgnoreCase(value) || "yes".equalsIgnoreCase(value)
36        || "on".equalsIgnoreCase(value) || "1".equalsIgnoreCase(value)) {
37      ignore = true;
38    }

39  }

40
41  //Process the request/response pair
42  public void doFilter(ServletRequest request, ServletResponse response,
43                       FilterChain chain) throws IOException, ServletException {
44    if (!ignore) {
45      request.setCharacterEncoding(encoding);
46    }

47
48    chain.doFilter(request, response);
49  }

50
51  //Clean up resources
52  public void destroy() {
53    this.filterConfig = null;
54  }

55}

56

      web.xml的相关片断如下:

 1  <filter>
 2    <filter-name>charsetfilter</filter-name>
 3    <filter-class>xxx.CharsetFilter</filter-class>
 4    <init-param>
 5      <param-name>encoding</param-name>
 6      <param-value>UTF-8</param-value>
 7    </init-param>
 8    <init-param>
 9      <param-name>ignore</param-name>
10      <param-value>false</param-value>
11    </init-param>
12  </filter>
13  <filter-mapping>
14    <filter-name>charsetfilter</filter-name>
15    <url-pattern>/*</url-pattern>
16  </filter-mapping>

      这样,在Action中处理表达的内容时,就不需要再做转换;而且在Action中处理数据给页面显示时,也不需要做转换。在页面中可以同时显示简体和繁体的内容,不需要去设置IE的编码。
      另外需要说明的就是如果数据库也支持编码的话,最好也是设成UTF-8编码,这样才能够完整的解决多语言的问题。例如MySQL 4.1以上的版本可以设置编码成utf8,在JDBC的URL中可以指定编码为UTF-8。
posted on 2005-05-13 14:26 小米 阅读(2247) 评论(11)  编辑  收藏 所属分类: Struts

评论:
# re: Struts的国际化完整解决方案 2005-08-11 17:40 | jiangyigirl
小米,我按照你所说的方法,都进行了设置,可是还是乱码,我用的是Sybase数据库,可是,我对数据库也进行了utf-8设置,那么问题出在哪里呢  回复  更多评论
  
# re: Struts的国际化完整解决方案 2005-08-17 09:31 | 小米
呵呵,很久都没有上来我的博客看看了。你的问题解决了么?你可以测试一下,看看从数据库取出来的是否能够正确显示出来,然后再看看页面中有没有设置编码为UTF-8。  回复  更多评论
  
# re: Struts的国际化完整解决方案 2005-08-18 10:34 | jiangyigirl
我的问题仍没有解决,数据库取出的为乱码,页面也进行了设置  回复  更多评论
  
# re: Struts的国际化完整解决方案 2005-08-18 11:52 | 小米
我觉得问题应该是出在你从数据库中取数据的过程,因为一般来说,如果从数据库中取出的数据用System.out.println()方法输出能够正常显示的话,那么在页面上设置正确就可以了。  回复  更多评论
  
# re: Struts的国际化完整解决方案 2005-08-18 14:33 | jiangyigirl
对呀,用System.out.println()输出也是乱码,按照你说的设置为utf-8,乱码为½ªÒã ,设置为gb2312,乱码为??。当然,在java中用System.out.println()输出的乱码都为??,我已经把数据库的charset设置为utf-8,也加了过滤器,可还是乱码,怎么回事,而且,properties文件中的汉字,有的正常显示,有的也显示为汉字,但字体却不正常  回复  更多评论
  
# re: Struts的国际化完整解决方案 2005-08-18 21:37 | 小米
我觉得你可能要认真看看Sybase JDBC的相关文档。那个过滤器是用在页面上的,不是用在数据库这一层。你首先要确保从数据库中取出的数据用System.out.println能够正常显示出来。  回复  更多评论
  
# re: Struts的国际化完整解决方案 2005-08-22 18:47 | jiangyigirl
我把服务器和jdbc连接的字符集都设为utf_8是,显示的仍为乱码
但我把服务器设置为iso8859_1编码,jdbc连接时的字符集设置为cp936(即gbk),从数据库中读出可以正常显示,但是插入就不对了,是不是因为服务器和jdbc设置的字符集不一样的缘故,真是晕死了,我都快疯了  回复  更多评论
  
# re: Struts的国际化完整解决方案 2005-08-22 23:40 | 小米
由于我没有使用过Sybase数据库,所以你问问对Sybase熟的人吧。我没有办法帮你解答,抱歉。  回复  更多评论
  
# re: Struts的国际化完整解决方案 2005-08-23 08:50 | jiangyigirl
没关系,thank you all the same,谢谢你腾出宝贵的时间来帮我!
我还有一个关于过滤器的问题,就是我写好过滤器的代码,并在web.xml中如下配置 <filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>com.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<servlet-name>/*</servlet-name>
</filter-mapping>
可是我发现我的页面并不经过我的过滤器对字符进行编码,这是怎么回事啊  回复  更多评论
  
# re: Struts的国际化完整解决方案 2005-08-23 23:28 | 小米
你用的web server是什么?能把你的filter的代码贴上来看看么?  回复  更多评论
  
# re: Struts的国际化完整解决方案 2005-08-24 10:28 | jiangyigirl
问题解决了,是我的配置文件<servlet-name>/*</servlet-name>
写错了,真不好意思,谢谢你  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: