我尝试从java文件中读取阿拉伯语和波斯语键&值,而不是使用ResourceBundle的属性文件,但它显示未知字符。
我所做的是将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当语言为en_US时,此代码运行良好,但当我将其更改为阿拉伯语或波斯语时,它将显示为:
ط«ط¨طھ ظ†ط§ظ…ط§غŒظ…غŒظ“
ط±ظ…ط2
ظ…ط±ظˆط±ط±ظ…طط§ط±طط§ظ“
请指教
发布于 2016-12-31 04:13:42
就我个人而言,我认为没有很好的理由将ListResourceBundle用于字符串。但是不管..。
这里的问题是源.java文件的编码。
您可以将文件编码为utf-8,但Java编译器不知道这一点,因此使用了系统编码。
您可以使用-encoding将所需的编码传递给编译器:
javac -encoding utf-8 LabelsBundle_fa_IR.java你可以用Unicode转义文件ASCII中的字符串.字符将不可读(将为“...\u0646.”),但编译器不再混淆:
native2ascii -encoding utf-8 LabelsBundle_fa_IR.java asciifile
rename asciifile LabelsBundle_fa_IR.java我假设您不发送用于本地化的.java文件:-)大多数本地化工具从文件中提取可本地化的内容,翻译它,并生成java返回。通常有一个使用unicode-转义来生成它的选项,因此不需要一直到.java并在那里进行转换。
===
这是一个糟糕的答案:
rb.getString("USERNAME").getBytes(), "UTF-8");getBytes依赖于系统编码,但这是运行时编码。
因此,它是您服务器的编码,而不是用于编译java文件的编码。可能会不一样。
===
为什么我更喜欢.properties而不是ListResourceBundle:
发布于 2016-12-30 18:22:11
String USERNAME = new String(rb.getString("USERNAME").getBytes(), "UTF-8"); https://stackoverflow.com/questions/41396143
复制相似问题