成長中的記憶
          這是我的成長,這是我的天地,學習JAVA,只因快樂。
          posts - 4,comments - 16,trackbacks - 0

              在用Java解決國際化問題的過程中,可能利用到的主要的類都是由java.util包提供的。該類包中相關的類有Locale、ResourceBundle、ListResourceBundle、PropertyResourceBundle等。
              Locale:該類包含對主要地理區域的地域化特征的封裝。其特定對象表示某一特定的地理、政治或文化區域。通過設定Locale,我們可以為特定的國家或地區提供符合當地文化習慣的字體、符號、圖標和表達格式。例如,我們可以通過獲得特定Locale下的Calendar類的實例,顯示符合特定表達格式的日期。
              ResourceBundle:該類是一個抽象類,需要通過靜態方法ResourceBundle.getBundle()指定具體實現類或屬性文件的基本名稱。基本名稱會協同指定的或默認的Locale類,決定具體調用的類或屬性文件的唯一名稱。例如:指定基本類或屬性文件名稱為TestBundle,而指定的Locale是CHINESE,那么最適合匹配的類名稱為TestBundle_zh_CN.class,而最佳匹配屬性文件名稱為TestBundle_zh_CN.properties。按照Java Doc和相關文檔的要求,如果該類或屬性文件沒有找到,系統會查找近似匹配(主文件名依次為TestBundle_zh和TestBundle的類或屬性文件)。該類提供的getKeys()方法用于獲得所有成員的鍵名,并提供handleGetObject方法獲得指定鍵的對應元素。
              ListResourceBundle:該類繼承ResourceBundle類,主要是增加了一些便于操作的成分,但還是抽象類。如果希望使用類的方式實現具體的ResourceBundle,一般情況下最好繼承這個類。
              PropertyResourceBundle:該類也繼承ResourceBundle類,可以實例化。該類的行為特征如同java.util.properties類,可以從輸入流中獲得具體屬性對。
              使用PropertyResourceBundle類獲得當地版本的國際化信息,部分代碼如下……
              public static final String BASE_PROP_FILE = “DISP”;
            public static final String SUFFIX = “.properties”;
            locale = Locale.getDefault();
            String propFile = BASE_PROP_FILE + “_” + locale.toString()+ SUFFIX;
            ResourceBundle rb;
            try {
             File file = new File(propFile);
             if (file.exists()) {
               is = new FileInputStream(file);
                rb = new PropertyResourceBundle(is);
                if (rb == null) System.out.println(“No Resource”);
             }
            } catch (IOException ioe) {
             System.out.println(“Error open file named ” + propFile);
            }
            Enumeration e = rb.getKeys();
            while (e.hasMoreElements()){
             key = (String)e.nextElement();
             value = (String)rb.handleGetObject(key);
             System.out.println(“KEY: ” + key +“ Value: ” + value);
            }
            ……
            DISP_zh_TW.properties文件的具體內容如下:
            Key1=可以
            Key2=撤銷
              等號后面是利用native2ascii程序轉化后的繁體漢字,如果不進行轉化,系統可能顯示亂碼。
              
              處理提示和幫助
              對于提示語言和幫助文件部分,可以把語言映射放在屬性文件或者ListResourceBundle類的子類中。下面程序是一個Servlet,它通過接受客戶端的選擇,把特定語言和字符版本的信息返回到客戶端。  public class ProcessServlet extends HttpServlet
            { //默認語言為中文
             public static final String DEFAULT_LANGUAGE = “zh”;
             //默認字符集為簡體中文
             public static final String DEFAULT_COUNTRY = “CN”;
             public void service(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
             HttpSession session = req.getSession(true);
             // 從客戶端收到的指定語言和字符的參數應當與Sun公司相關規定一致
             String lang = req.getParameter(“language”);
             String country = req.getParameter(“country”);
             if (lang == null) {
                 //如果沒有收到參數,就試圖從Session里獲得
               lang = (String) session.getAttribute(“language”);
               country = (String) session.getAttribute(“country”);
             } else {
               session.setAttribute(“language”, lang);
               session.setAttribute(“country”, country);
             }
             if (lang == null){
                 //如果無法從上述手段得到語言和字符信息,就使用默認值
               lang = DEFAULT_LANGUAGE;
               country = DEFAULT_COUNTRY
               session.setAttribute(“language”, lang);
              session.setAttribute(“country”, country);
             }
             Locale locale = null;
             ResourceBundle bundle = null;
             try {
               locale = new Locale(lang, country);
              } catch (Exception e) {
                System.out.println(“No locale with” + country + “_” + lang);
               locale = Locale.getDefault();
              }
              try {
                 bundle = ResourceBundle.getBundle(“DisplayList”, locale);
             } catch( MissingResourceException e) {
               System.out.println( “No resources available for locale ” + locale);
               bundle = ResourceBundle.getBundle(“DisplayList”, Locale.US);
             }
             res.setContentType(“text/html”);
             PrintWriter out = res.getWriter();
             out.println(“<html>”);
             out.println(“<head>”);
             String title = bundle.getString(“title”);
              String welcome =bundle.getString(“welcome”);
             String notice = bundle.getString(“notice”);
             out.println(“<title>”+ title +“</title>”);
             out.println(“</head>”);
             out.println(“<body bgcolor=”white“>”);
             out.println(“<h3>” + welcome + “</h3>”);
             out.println(“<br>”);
             out.println(“<b>” + notice +“</b>”);
             out.println(“</body>”);
             out.println(“</html>”);
            }
            }
          上述Servlet使用的屬性文件(DisplayList_zh_CN.properties)內容如下:
          title=中文版
          welcome=這是簡體中文版面
          notice=簡體中文測試成功
          注意:該文件直接采用了中文,而不是經過轉化的Unicode編碼,這是由于大多數Web服務器不需要上述轉化。
              在實際使用中,如果Web服務器支持Servlet 2.3規范(如jakarta-tomcate 4.0),那么上面提到的Servlet應當稍加改變,以作為其他Servlet的處理器使用。另外,如果把ResourceBundle的特定版本存放在無狀態會話Bean中,就可以在一定程度上提高程序效率。
              對于顯示字符出現亂碼的問題,如果是通過屬性文件實現國際化解決方案,那么可能是直接在屬性文件中寫入了非標準ASCII文字。解決方法是利用JDK提供的工具native2ascii.exe掃描所有屬性文件,用掃描結果覆蓋原有文件內容。如果我們是利用類文件實現轉換方案,那么需要重新編譯相關類文件,并在編譯時指定編碼集。例如,編譯使用國標碼的類文件,采用的編譯命令如下:
          javac -encoding GB2312 your_java_file

          posted on 2006-02-17 16:12 aiyoyoyo 閱讀(3557) 評論(0)  編輯  收藏 所屬分類: JSP
          主站蜘蛛池模板: 敖汉旗| 遂溪县| 湖南省| 南部县| 建湖县| 嵊泗县| 定安县| 阜新| 三河市| 白玉县| 那曲县| 阿合奇县| 阜康市| 马关县| 大悟县| 文登市| 夏津县| 巴彦淖尔市| 郁南县| 阳谷县| 武乡县| 怀安县| 醴陵市| 托克托县| 靖远县| 雷山县| 三明市| 周至县| 龙门县| 太谷县| 梁平县| 都安| 沂源县| 浦北县| 日土县| 台东县| 武清区| 微博| 读书| 外汇| 运城市|