2016-12-30 65 views
0

我想读阿拉伯语和波斯语键从Java文件,而不是性质&值与资源包文件,但它显示未知字符。如何阅读阿拉伯语或从Java文件波斯(键和值)与资源包

我所做的是我编写3个文件为:1。 LabelsBundle_en_US.java 2. LabelsBundle_ar_AE.java 3. LabelsBundle_fa_IR.java

我LabelsBundle_en_US.java文件看起来像:

public class LabelsBundle_en_US extends ListResourceBundle{ 
      static final Object[][] contents = { 
               {"REGISTER","Registration Form"}, 
               {"USERNAME","Email"}, 
               {"PASSWORD","Password"}, 
               {"CONFIRM_PASS","Confirm Password"}, 
               {"SUBMIT","Register"} 
               }; 

      protected Object[][] getContents(){ 
      return contents; 
      } 
    }//class 

我LabelsBundle_fa_IR.java文件看起来像:

public class LabelsBundle_fa_IR extends ListResourceBundle{ 
     static final Object[][] contents = { 
              {"REGISTER","ثبت نام"}, 
              {"USERNAME","ایمیل"}, 
              {"PASSWORD","رمز"}, 
              {"CONFIRM_PASS","مرور رمز"}, 
              {"SUBMIT","ارسال"} 
              }; 

     protected Object[][] getContents(){ 
     return contents; 
     } 
}//class 

这里是我的servlet:

protected void doGet(HttpServletRequest req, HttpServletResponse res)throws ServletException, IOException{  
     res.setContentType("text/html; charset=UTF-8"); 
     req.setCharacterEncoding("UTF-8"); 
     res.setCharacterEncoding("UTF-8");  
     StringWriter sWriter = new StringWriter(); 
     PrintWriter out   = new PrintWriter(sWriter);   

     String country   = req.getParameter("country"); 
     String language   = req.getParameter("language"); 
     Locale locale=null; 
     if(country == null){ 
      locale = new Locale("en","US"); 
     } 
     else{ 
      locale = new Locale(language, country); 
     }  
     ResourceBundle rb = ResourceBundle.getBundle("com.i18n.resource.bundles.LabelsBundle",locale); 
     req.setAttribute("resource", rb); 

     out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"+ 
        "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">"+ 
        "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"fi\" dir=\"auto\">"+ 
        "<head>"+ 
        "<meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />"+ 
        "<body>"+ 
        "<center><h1>"+rb.getString("REGISTER")+"</h1></center>"+ 
        "<table border=0 width=540 align=center>"+ 
         "<tr><td colspan=2 align=center><h1>"+rb.getString("REGISTER")+"</h1></td></tr>"+ 
         "<tr><td>"+rb.getString("USERNAME")+"</td><td><input type=text name=username></td></tr>"+ 
         "<tr><td>"+rb.getString("PASSWORD")+"</td><td><input type=password name=password></td></tr>"+ 
         "<tr><td>"+rb.getString("CONFIRM_PASS")+"</td><td><input type=password name=cPass></td></tr>"+ 
         "<tr><td colspan=2 align=center><input type=submit value="+rb.getString("SUBMIT")+"></td></tr>"+ 
        "</table></html>"); 
     res.getWriter().print(sWriter.toString()); 
    }//doGet 

此代码(S)工作正常时,语言是en_US,但是当我将其更改为阿拉伯语或波斯语然后它作为显示:

ط«ط¨طھ ظ†ط§ظ… 

ط§غŒظ...غŒظ“
ط± ظ...ط²
ظ...ط±ظط±ط±ظ...ط² ط§ط±ط³ط§ظ“

请告知

回答

0

就个人而言,我认为没有什么理由使用ListResourceBundle的字符串。 但是,嘿,什么...

这里的问题是源的.java文件的编码。

你可以对文件进行编码为UTF-8,但Java编译器不知道,并使用系统编码。

a。您可以使用-encoding将所需的编码传递给编译器:

javac -encoding utf-8 LabelsBundle_fa_IR.java 

b。您可以使用Unicode转义制作文件ASCII的字符串。 字符将无法读取(将“... \ u0646 ......”),但没有混乱编译器了:

native2ascii -encoding utf-8 LabelsBundle_fa_IR.java asciifile 
rename asciifile LabelsBundle_fa_IR.java 

我以为你不发出一个.java文件对于本地化:-) 大多数本地化工具从文件中提取可本地化的东西,翻译它,然后生成Java。通常有一个选项可以用unicode-escape生成它,所以不需要一路去.java并在那里转换。

===

这是一个不好回答:

rb.getString("USERNAME").getBytes(), "UTF-8"); 

的getBytes取决于系统的编码,但这是运行时编码。

所以它是你的服务器的编码,与用来编译你的java文件开始的编码。它可能不同。

===

为什么我喜欢的.properties到了ListResourceBundle:

  • 本地化(翻译人员,而不是由技术人员)不会发生在.java文件。 字符串必须被提取出来,然后放回去。由于.java文件 可以包含代码,不包含代码,因此在此过程中更容易受到损坏。 大多数本地化工具处理的.properties很好,但

  • 的属性文件的编码被很好地定义不ListResourceBundle的:拉丁1 有没有“魔法”,不依赖于系统。 所以你在编译时不需要特殊的标志。

  • ListResourceBundle适用于特定于语言环境的对象。 认为商业逻辑,例如使税收规则复杂化, 或特殊的工作流程。这就是为什么它是从String到Object的映射。 你当然可以把字符串放在那里,但是.properties或者.xml是专门为字符串设计的 。

+0

您的解决方案是为ListResourceBundle的文件的工作完美。正如你建议我使用属性文件,并再次面临同样的问题。与Java资源包封装阿拉伯语,并不能准确显示波斯但奇怪的迹象 – Ghayel

+0

答案是存在的:“在属性文件的编码是明确的:拉丁语1”。所以,如果你把UTF-8没有工作。您需要使用native2ascii并将其转换为转义形式。是的,这很笨拙,但这是标准的,官方的做法。这比在Java源代码上做得更可靠。它看起来像被(最终!)计划为Java 9. –

+0

'海峡=新的String UTF-8的.properties(rb.getString(键).getBytes( “ISO-8859-1”), “UTF-8”); '解决我的问题 – Ghayel

0
String USERNAME = new String(rb.getString("USERNAME").getBytes(), "UTF-8");  
相关问题