使用 JSP 中的资源包属性进行国际化,非拉丁文本变为 Mojibake
Internationalization using resource bundle properties in JSP, non-Latin text becomes Mojibake
我有以下 index.jsp:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<fmt:setLocale value="ru_RU"/>
<fmt:setBundle basename="messages"/>
<html>
<head>
<title></title>
</head>
<body>
<h1><fmt:message key="login"/></h1>
</body>
</html>
和属性文件messages_ru_RU.properties:
login = Логин
问题是我在输出中得到了垃圾 unicode 字符:
Ëîãèí
更新
将 .properies 文件编码更改为 UTF-8。
最新输出: Ðогин
请帮我把它改成正常的西里尔字母。
属性 文件:
messages_ru_RU.properties
属性文件根据 specification 使用 ISO-8859-1 读取。
... the input/output stream is encoded in ISO 8859-1 character encoding. Characters that cannot be directly represented in this encoding can be written using Unicode escapes as defined in section 3.3 of The Java™ Language Specification; only a single 'u' character is allowed in an escape sequence. The native2ascii tool can be used to convert property files to and from other character encodings.
因此,ISO-8859-1 range needs to be escaped in the Unicode escape sequences \uXXXX
未涵盖的任何字符。您可以使用 JDK 提供的 native2ascii
工具来转换它们。您可以在 JDK 的 /bin
文件夹中找到它。
这是一个示例,假设 foo_utf8.properties
是您使用 UTF-8 保存的那个,foo.properties
是您想在您的应用程序中使用的那个:
native2ascii –encoding UTF-8 foo_utf8.properties foo.properties
在您的特定情况下,有问题的 属性 将转换为:
login = \u041B\u043E\u0433\u0438\u043D
这可以成功读取并显示在具有以下最低 @page
配置的 JSP 页面中:
<%@ page pageEncoding="UTF-8" %>
(您拥有的其余部分无关紧要,因为在设置上述设置时这些已经是默认值)
如果您使用的是 Java-aware IDE,例如 Eclipse,那么您可以只使用它的内置属性文件编辑器,它应该会自动与 .properties
中的文件相关联一个 Java 面的项目。如果您使用此编辑器而不是纯文本编辑器/源代码编辑器,那么它会自动转义未包含在 ISO-8859-1 范围内的字符。
另请参阅:
- Unicode - How to get the characters right?
- How to internationalize a Java web application?
Image showing to change to unicode
我在使用印地语时遇到了同样的问题,所以我将 pageEncoding 更改为 UTF-8 并使用 Unicode 编码保存了文件。因为我在 .properties 文件中给出了 unicode。这对我有用。
因为 Java SE 属性文件以 UTF-8 编码加载。
见https://docs.oracle.com/javase/9/intl/internationalization-enhancements-jdk-9.htm and
我有以下 index.jsp:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<fmt:setLocale value="ru_RU"/>
<fmt:setBundle basename="messages"/>
<html>
<head>
<title></title>
</head>
<body>
<h1><fmt:message key="login"/></h1>
</body>
</html>
和属性文件messages_ru_RU.properties:
login = Логин
问题是我在输出中得到了垃圾 unicode 字符:
Ëîãèí
更新
将 .properies 文件编码更改为 UTF-8。 最新输出: Ðогин
请帮我把它改成正常的西里尔字母。
属性 文件: messages_ru_RU.properties
属性文件根据 specification 使用 ISO-8859-1 读取。
... the input/output stream is encoded in ISO 8859-1 character encoding. Characters that cannot be directly represented in this encoding can be written using Unicode escapes as defined in section 3.3 of The Java™ Language Specification; only a single 'u' character is allowed in an escape sequence. The native2ascii tool can be used to convert property files to and from other character encodings.
因此,ISO-8859-1 range needs to be escaped in the Unicode escape sequences \uXXXX
未涵盖的任何字符。您可以使用 JDK 提供的 native2ascii
工具来转换它们。您可以在 JDK 的 /bin
文件夹中找到它。
这是一个示例,假设 foo_utf8.properties
是您使用 UTF-8 保存的那个,foo.properties
是您想在您的应用程序中使用的那个:
native2ascii –encoding UTF-8 foo_utf8.properties foo.properties
在您的特定情况下,有问题的 属性 将转换为:
login = \u041B\u043E\u0433\u0438\u043D
这可以成功读取并显示在具有以下最低 @page
配置的 JSP 页面中:
<%@ page pageEncoding="UTF-8" %>
(您拥有的其余部分无关紧要,因为在设置上述设置时这些已经是默认值)
如果您使用的是 Java-aware IDE,例如 Eclipse,那么您可以只使用它的内置属性文件编辑器,它应该会自动与 .properties
中的文件相关联一个 Java 面的项目。如果您使用此编辑器而不是纯文本编辑器/源代码编辑器,那么它会自动转义未包含在 ISO-8859-1 范围内的字符。
另请参阅:
- Unicode - How to get the characters right?
- How to internationalize a Java web application?
Image showing to change to unicode
我在使用印地语时遇到了同样的问题,所以我将 pageEncoding 更改为 UTF-8 并使用 Unicode 编码保存了文件。因为我在 .properties 文件中给出了 unicode。这对我有用。
因为 Java SE 属性文件以 UTF-8 编码加载。
见https://docs.oracle.com/javase/9/intl/internationalization-enhancements-jdk-9.htm and