隨筆-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 小米 閱讀(2291) 評論(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>
          寫錯了,真不好意思,謝謝你  回復  更多評論
            
          主站蜘蛛池模板: 集安市| 兴和县| 西盟| 岳阳县| 安乡县| 抚远县| 和政县| 景洪市| 双峰县| 河北省| 千阳县| 曲水县| 红安县| 晋城| 桃园市| 射阳县| 开远市| 镇江市| 广昌县| 余庆县| 宜都市| 崇文区| 千阳县| 田东县| 霍邱县| 固阳县| 涟水县| 潼关县| 交口县| 麻江县| 平乡县| 临西县| 鄄城县| 德昌县| 牡丹江市| 阿坝县| 辽中县| 耿马| 门头沟区| 内乡县| 鲁山县|