国际化打印出胡言乱语

时间:2014-03-16 19:08:12

标签: java web internationalization resourcebundle

我想将i18n添加到我的网站项目中。

但我打印出乱码,之前

enter image description here

enter image description here

以下是页面代码的页面摘要:

<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>

<c:set var="language"
       value="${not empty param.language ? param.language : not empty language ? language : pageContext.request.locale}"
       scope="session"/>
<fmt:setLocale value="${language}"/>
<fmt:setBundle basename="com.java.task11.i18n.text"/>

<html lang="${language}">
<head>
    <title>Profile Info</title>
    <jsp:include page="parts/header.jsp"/>
</head>

<body>
<div class="container-fluid users-table">
    <%--navbar--%>
    <div class="row">
        <div class="col-md-10 col-xs-12 col-md-offset-1 table-nav">
            <jsp:include page="parts/navbar.jsp"/>
        </div>
    </div>

navbar.jsp的摘要:

<li class="lang">
   <a href="<%= request.getContextPath()%>?language=${language == 'ua' ? 'en' : 'uk'}">
       ${language == 'ua' ? 'EN' : 'UKR'}
   </a>
</li>

以下是资源包:

enter image description here

我无法弄清楚为什么会这样?

如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

我的假设是你使用ResourceBundle

不幸的是,出于向后兼容性的原因,它无法以ISO-8859-1之外的任何其他编码方式读取属性文件。您的属性文件似乎以UTF-8编码。

演示:让我们在类路径的根目录中取一个文件名t.properties,其内容以UTF-8编码:

mouton = bêêêê

现在,让我们尝试打印出这个mouton密钥:

final ResourceBundle bundle = ResourceBundle.getBundle("t");
System.out.println(bundle.getString("mouton"));

输出:

bêêêê

垃圾。

这就是我开发this library没有这个问题的原因;它可以读取UTF-8中的i18n属性文件。示范:

// Reads in UTF-8 by default; can choose any encoding
final MessageBundle bundle = PropertiesBundle.forPath("t");
System.out.println(bundle.getMessage("mouton"));

输出:

bêêêê

正确!

“有趣”的是,它使用method which is available in Properties(自1.6起)但ResourceBundle不使用,也没有提供使用它的方法......

答案 1 :(得分:0)

我找到了解决方案:

写入 unicode 符号。为此:

IDEA - 具有特殊的“透明原生到ASCII转换”选项(设置&gt;文件编码)。