一尘不染

使用JSP中的资源包属性进行国际化,非拉丁文字变为Mojibake

jsp

我有以下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


阅读 256

收藏
2020-06-08

共1个答案

一尘不染

属性文件根据使用ISO-8859-1读取的规范进行。

…输入/输出流以ISO 8859-1字符编码进行编码。可以使用 Java™语言规范
第3.3节中定义的Unicode转义来编写无法在此编码中直接表示的字符;转义序列中仅允许使用一个’u’字符。native2ascii工具可用于在其他字符编码之间来回转换属性文件。

因此,ISO-8859-1范围未涵盖的任何字符都需要在Unicode转义序列中转义
\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感知的IDE(例如Eclipse),则可以使用其内置的属性文件编辑器,该编辑器应自动与.propertiesJava方面的项目中的文件关联。如果使用此编辑器而不是纯文本编辑器/源代码编辑器,则它将自动转义ISO-8859-1范围未涵盖的字符。

2020-06-08