首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用ResourceBundle从java文件中读取阿拉伯语或波斯语(键和值)

如何使用ResourceBundle从java文件中读取阿拉伯语或波斯语(键和值)
EN

Stack Overflow用户
提问于 2016-12-30 12:18:07
回答 2查看 1.2K关注 0票数 0

我尝试从java文件中读取阿拉伯语和波斯语键&值,而不是使用ResourceBundle的属性文件,但它显示未知字符。

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

我的LabelsBundle_en_US.java文件看起来如下:

代码语言:javascript
复制
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文件看起来如下:

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

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

以下是我的servlet:

代码语言:javascript
复制
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

当语言为en_US时,此代码运行良好,但当我将其更改为阿拉伯语或波斯语时,它将显示为:

代码语言:javascript
复制
ط«ط¨طھ ظ†ط§ظ…

ط§غŒظ…غŒظ“

ط±ظ…ط2

ظ…ط±ظˆط±ط±ظ…طط§ط±طط§ظ“

请指教

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-31 04:13:42

就我个人而言,我认为没有很好的理由将ListResourceBundle用于字符串。但是不管..。

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

您可以将文件编码为utf-8,但Java编译器不知道这一点,因此使用了系统编码。

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

代码语言:javascript
复制
javac -encoding utf-8 LabelsBundle_fa_IR.java

你可以用Unicode转义文件ASCII中的字符串.字符将不可读(将为“...\u0646.”),但编译器不再混淆:

代码语言:javascript
复制
native2ascii -encoding utf-8 LabelsBundle_fa_IR.java asciifile
rename asciifile LabelsBundle_fa_IR.java

我假设您不发送用于本地化的.java文件:-)大多数本地化工具从文件中提取可本地化的内容,翻译它,并生成java返回。通常有一个使用unicode-转义来生成它的选项,因此不需要一直到.java并在那里进行转换。

===

这是一个糟糕的答案:

代码语言:javascript
复制
rb.getString("USERNAME").getBytes(), "UTF-8");

getBytes依赖于系统编码,但这是运行时编码。

因此,它是您服务器的编码,而不是用于编译java文件的编码。可能会不一样。

===

为什么我更喜欢.properties而不是ListResourceBundle:

  • 本地化(由翻译,而不是由技术人员)不会发生在.java文件上。必须提取字符串,并将其放回。由于.java文件可以包含代码以及其他不包含的内容,因此在处理过程中更容易损坏。大多数本地化工具都能很好地处理.properties,而不是ListResourceBundle。
  • .properties文件的编码是很好的定义:拉丁文1。没有“魔力”,不依赖于系统。所以在编译时不需要特殊的标志。
  • 对于特定于地区的对象来说,ListResourceBundle很好。考虑一下业务逻辑,例如,复杂的税收规则,或特殊的工作流程。这就是为什么它是一个从字符串到对象的映射。当然,您可以将字符串放在那里,但是.properties或.xml是专门为字符串设计的。
票数 0
EN

Stack Overflow用户

发布于 2016-12-30 18:22:11

代码语言:javascript
复制
String USERNAME = new String(rb.getString("USERNAME").getBytes(), "UTF-8");     
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41396143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档