如何显示塞尔维亚语、俄语和阿拉伯语文本(JSF 2.0)

sfr*_*frj 3 java jsf internationalization jsf-2 jakarta-ee

在互联网上我找到了一本名为JSF 2.0 Cookbook 的书。

\n\n

我骑了第 7 章(国际化),我发现它非常简单,我自己尝试了所有内容,除了使用俄语、阿拉伯语、塞尔维亚语等语言的字符之外,一切都运行良好......

\n\n

书上是这样说的:

\n\n
\n

使用阿拉伯语、中文、俄语字符(等等)时的一个常见问题听起来像这样:“我可以在 inputText\n 组件中键入这些字符,但是当我提交表单时,插入的文本会显示在Unicode 字符,而不是人类可读字符。如何解决这个问题?”。解决方案非常简单。您所要做的就是在 JSF 页面中写入以下行:

\n
\n\n
<%@page contentType="text/html" pageEncoding="UTF-8"%>\n
Run Code Online (Sandbox Code Playgroud)\n\n

这正是我所做的。我在主 JSF 模板的第一行代码中添加了这一行。但这没有用。\n我错过了什么?我的所有本地化属性文件都配置为使用 UTF-8:

\n\n

在此输入图像描述

\n\n

我还在 h:head 标签中尝试了这一行:

\n\n
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>\n
Run Code Online (Sandbox Code Playgroud)\n\n

我还需要什么才能看到页面中用俄语、阿拉伯语编写的文本...\n当我更改为 ru、ar 或 sr 区域设置时我看到的唯一内容是这样的文本:

\n\n
\n

\xc3\x99\xc3\x98\xc2\xa8\xc3\x98\xc2\xad\xc3\x98\xc2\xab \xc3\x99\xc3\x99 \xc3\x98\xc2\xb5\xc3\x99\xc3 \x98\xc2\xad\xc3\x98\xc2\xa7\xc3\x98\xc2\xaa \xc3\x99\xc3\x99\xc3\x99\xc3\x98\xc2\xa9 \xc3\x99\xc3\x99 \xc3\x98\xc2\xb3\xc3\x99

\n
\n\n

更新\n阅读了一些有关本地化的文章后,我得出的结论是我的应用程序需要进行转换才能呈现特殊字符(我不喜欢属性文件中的 scape 字符的解决方案)。我在此链接中关注了一个示例:http://jdevelopment.nl/internationalization-jsf-utf8-encoded-properties-files/

\n\n

我理解其中的大部分内容,但是当我尝试在我的应用程序中执行此操作时,我发现我仍然在浏览器上看到垃圾。我尝试了各种方法,但没有成功:

\n\n

这就是我组织文件的方式:

\n\n

在此输入图像描述

\n\n

这是我的 faces-config.xml

\n\n
<?xml version="1.0" encoding="UTF-8"?>\n\n<faces-config\n    xmlns="http://java.sun.com/xml/ns/javaee"\n    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"\n    version="2.0">\n    <application>\n        <message-bundle>resources.application</message-bundle>\n        <locale-config>\n            <default-locale>en</default-locale>\n            <supported-locale>en</supported-locale>\n            <supported-locale>de</supported-locale>\n            <supported-locale>it</supported-locale> \n            <supported-locale>es</supported-locale> \n            <supported-locale>fr</supported-locale> \n            <supported-locale>sr</supported-locale> \n            <supported-locale>ar</supported-locale>\n            <supported-locale>ru</supported-locale>\n        </locale-config>\n\n        <!-- Localization files configuration -->\n        <resource-bundle>\n            <!-- Path to the file -->\n            <base-name>resources.messages</base-name>\n            <!-- Variable representation of the file -->\n            <var>msgs</var>\n        </resource-bundle>              \n    </application>\n\n</faces-config>\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我在上面的链接中找到的一个文件,能够进行转换:

\n\n
package support;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.net.URL;\nimport java.net.URLConnection;\nimport java.util.Enumeration;\nimport java.util.Locale;\nimport java.util.PropertyResourceBundle;\nimport java.util.ResourceBundle;\n\nimport javax.faces.context.FacesContext;\n\npublic class TextBunddle extends ResourceBundle {\n\n    protected static final String BUNDLE_NAME = "resources.messages";\n    protected static final String BUNDLE_EXTENSION = "properties";\n    protected static final Control UTF8_CONTROL = new UTF8Control();\n\n    public TextBunddle() {\n        setParent(ResourceBundle.getBundle(BUNDLE_NAME,\n            FacesContext.getCurrentInstance().getViewRoot().getLocale(), UTF8_CONTROL));\n    }\n\n    @Override\n    protected Object handleGetObject(String key) {\n        return parent.getObject(key);\n    }\n\n    @Override\n    public Enumeration getKeys() {\n        return parent.getKeys();\n    }\n\n    protected static class UTF8Control extends Control {\n        public ResourceBundle newBundle\n            (String baseName, Locale locale, String format, ClassLoader loader, boolean reload)\n                throws IllegalAccessException, InstantiationException, IOException\n        {\n            // The below code is copied from default Control#newBundle() implementation.\n            // Only the PropertyResourceBundle line is changed to read the file as UTF-8.\n            String bundleName = toBundleName(baseName, locale);\n            String resourceName = toResourceName(bundleName, BUNDLE_EXTENSION);\n            ResourceBundle bundle = null;\n            InputStream stream = null;\n            if (reload) {\n                URL url = loader.getResource(resourceName);\n                if (url != null) {\n                    URLConnection connection = url.openConnection();\n                    if (connection != null) {\n                        connection.setUseCaches(false);\n                        stream = connection.getInputStream();\n                    }\n                }\n            } else {\n                stream = loader.getResourceAsStream(resourceName);\n            }\n            if (stream != null) {\n                try {\n                    bundle = new PropertyResourceBundle(new InputStreamReader(stream, "UTF-8"));\n                } finally {\n                    stream.close();\n                }\n            }\n            return bundle;\n        }\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我认为错误出在 faces-config.xml 中,但我不知道应该如何配置该文件,以便在我的页面中使用如下命令时能够看到本地化消息:

\n\n
#{msgs.mainbaner}\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我请求更改语言时,Firebug 会这么说:

\n\n

在此输入图像描述

\n

Bal*_*usC 5

<%@page contentType="text/html" pageEncoding="UTF-8"%>
Run Code Online (Sandbox Code Playgroud)

这就是 JSP 语法。这毫无意义。您正在使用默认情况下已使用 UTF-8 的 Facelets。

<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
Run Code Online (Sandbox Code Playgroud)

如果您通过 HTTP 提供页面而不是从本地磁盘文件系统打开,那么这是毫无价值的。


如果您看到垃圾,则问题是由其他原因引起的。我建议花一些时间来阅读这篇文章:Unicode - 如何获得正确的字符?

至少,JSF2/Facelets 的关键点是:

  • 将您的 IDE 配置为使用 UTF-8。
  • 配置您的数据库/表以使用 UTF-8。
  • 属性文件必须是 ISO-8859-1 并且必须使用 unicode 转义。但是 JSF 有一种自定义风格的解决方法,ResourceBundle以便您可以在属性文件中使用 UTF-8。