在互联网上,我找到了一本名为JSF 2.0 cookbook的书。
我骑了第7章(国际化),我发现它非常简单,我自己尝试了一切,除了使用俄语,阿拉伯语,塞尔维亚语等语言中的字符外,一切正常...
这本书说:
使用阿拉伯语,中文,俄语字符时的常见问题(和 听起来像这样:“我可以在inputText中输入这样的字符 组件,但是当我提交表单时,会显示插入的文本 用Unicode字符代替人类可读的字符。如何 解决这个问题?”。 解决方案非常简单。你所要做的就是写下 JSF页面中的以下行:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
这就是我所做的。我在主JSF模板的第一行代码中添加了该行。但它没有用。 我错过了什么?我的所有本地化属性文件都配置为使用UTF-8:
我也在我的h:head标签中尝试了这一行:
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
我还需要在俄语,阿拉伯语中查看我的页面中的文字... 当我改为ru,ar或sr语言环境时,我唯一看到的是这样的文字:
¨Ø¨ØØ«ÙÙØμÙØاتÙÙÙØ©ÙسÙ
更新 在阅读了一些关于本地化的文章后,我得出结论,我的应用程序需要进行转换以便能够呈现特殊字符(我不喜欢属性文件中的scape字符的解决方案)。我在这个链接上关注了一个例子:http://jdevelopment.nl/internationalization-jsf-utf8-encoded-properties-files/
我理解其中的大部分,但是当我尝试在我的应用程序中执行此操作时,我看到我仍然在浏览器上看到了rubish。我试过各种各样的方式,但都没有用:
这是我组织文件的方式:
这是我的faces-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<faces-config
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
version="2.0">
<application>
<message-bundle>resources.application</message-bundle>
<locale-config>
<default-locale>en</default-locale>
<supported-locale>en</supported-locale>
<supported-locale>de</supported-locale>
<supported-locale>it</supported-locale>
<supported-locale>es</supported-locale>
<supported-locale>fr</supported-locale>
<supported-locale>sr</supported-locale>
<supported-locale>ar</supported-locale>
<supported-locale>ru</supported-locale>
</locale-config>
<!-- Localization files configuration -->
<resource-bundle>
<!-- Path to the file -->
<base-name>resources.messages</base-name>
<!-- Variable representation of the file -->
<var>msgs</var>
</resource-bundle>
</application>
</faces-config>
这是我在上面链接中找到的文件,可以进行转换:
package support;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.Enumeration;
import java.util.Locale;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
import javax.faces.context.FacesContext;
public class TextBunddle extends ResourceBundle {
protected static final String BUNDLE_NAME = "resources.messages";
protected static final String BUNDLE_EXTENSION = "properties";
protected static final Control UTF8_CONTROL = new UTF8Control();
public TextBunddle() {
setParent(ResourceBundle.getBundle(BUNDLE_NAME,
FacesContext.getCurrentInstance().getViewRoot().getLocale(), UTF8_CONTROL));
}
@Override
protected Object handleGetObject(String key) {
return parent.getObject(key);
}
@Override
public Enumeration getKeys() {
return parent.getKeys();
}
protected static class UTF8Control extends Control {
public ResourceBundle newBundle
(String baseName, Locale locale, String format, ClassLoader loader, boolean reload)
throws IllegalAccessException, InstantiationException, IOException
{
// The below code is copied from default Control#newBundle() implementation.
// Only the PropertyResourceBundle line is changed to read the file as UTF-8.
String bundleName = toBundleName(baseName, locale);
String resourceName = toResourceName(bundleName, BUNDLE_EXTENSION);
ResourceBundle bundle = null;
InputStream stream = null;
if (reload) {
URL url = loader.getResource(resourceName);
if (url != null) {
URLConnection connection = url.openConnection();
if (connection != null) {
connection.setUseCaches(false);
stream = connection.getInputStream();
}
}
} else {
stream = loader.getResourceAsStream(resourceName);
}
if (stream != null) {
try {
bundle = new PropertyResourceBundle(new InputStreamReader(stream, "UTF-8"));
} finally {
stream.close();
}
}
return bundle;
}
}
}
我认为错误在faces-config.xml中,但我不知道我应该配置文件的方式是什么,以便能够在我的页面中看到本地化消息时我使用这样的命令:
#{msgs.mainbaner}
当我要求更改语言时,这就是firebug所说的:
答案 0 :(得分:4)
<%@page contentType="text/html" pageEncoding="UTF-8"%>
这就是JSP语法。这毫无意义。您正在使用默认情况下使用UTF-8的Facelets。
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
如果您通过HTTP提供页面而不是从本地磁盘文件系统打开,那么这一点毫无价值。
如果您看到垃圾,那么问题是由其他原因造成的。我建议花一些时间来完成这篇文章:Unicode - How to get the characters right?
至少,JSF2 / Facelets的关键点是:
ResourceBundle
风格的解决方法,因此您可以在属性文件中使用UTF-8。