i18n: JSP 中德语特殊字符 Umlaut 显示不正确

4

我有一个JSP页面,应该通过fmt:message从.properties文件中显示一些德语文本,例如:

.properties文件中对应的条目是: service.test.hware.test = Hardware prüfen(第2个单词r和f之间有一个umlaut)。

在Internet Explorer上,它会显示为:

Hardware prüfen

umlaut损坏了。这里发生了什么?请注意,我们正在使用Spring MVC。


文件正在使用哪种编码进行服务?同时,必须阅读:http://www.joelonsoftware.com/articles/Unicode.html - Matt Ball
在 .jsp 文件的顶部附近添加 <%@ page pageEncoding="UTF-8" %>。 - fred basset
3个回答

6
如果您使用org.springframework.context.support.ResourceBundleMessageSource定义了Spring的messageSource,那么即使属性文件是以utf-8编码,属性也会以iso-8859-1编码加载(Java默认以iso-8859-1编码加载属性)。
建议使用org.springframework.context.support.ReloadableResourceBundleMessageSource。您可以通过该MessageSource实现配置默认编码。有关该类的更多信息/特性,请参见Javadoc文档。
示例:
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="classpath:message"/>
    <property name="defaultEncoding" value="UTF-8" />
</bean>

运行完美! - macskay

6

ü 是一个典型的UTF-8编码的 ü 被错误地编码为ISO-8859-1而不是UTF-8。以下是程序化证据:

System.out.println(new String("ü".getBytes("UTF-8"), "ISO-8859-1")); // ü

由于您提到属性文件中的相同字符在某些JSP中正常工作,而在其他JSP中则不正常,这意味着浏览器没有正确地被指示使用UTF-8来显示服务器返回的字符。
这个指示发生在HTTP Content-Type 头部。通过使用任何HTTP头部调试工具,您必须能够找出返回的头信息。其中一个流行的工具是 Firebug
请注意 charset=utf-8 的存在。
通常,在JSP中,只需在文件顶部放置以下行即可实现此目的:
<%@ page pageEncoding="UTF-8" %>

参见:


感谢您提供详细的答案。我检查了服务器返回的内容类型,它确实是utf8,就像您的示例中指定的一样。相关的JSP文件的第一行也有<%@ page pageEncoding="UTF-8" %>,但仍然存在问题。 - fred basset
你能确认100%确定在JSP中显示的是同一个属性吗?加载和渲染的方式也是相同的吗?因为问题的另一个原因可能就在那里。 - BalusC

0

可能是编码问题。这可能是由于您提供的编码方式导致的,因此您应该:

  1. 尝试将ü转换为其它形式。这不会修复其他字符,但您可以将所有非ASCII代码点转换为{形式,其中1234是字符的十进制值,和/或
  2. 按照Fred Basset所描述的要求指定页面编码。除非您有特定原因不使用UTF-8,否则应使用UTF-8。

或者这可能是读取属性文件时使用的编码方式的问题。如果您正在使用FileReader,请不要使用它。改用new InputStreamReader(new FileInputStream(...), encoding),其中encoding是属性文件的编码方式。


我对这个问题有一些进一步的数据。使用上述JSP fmt:message标记的大多数屏幕都能正确显示。我不得不添加一个Spring控制器来决定转发到两个不同的JSP之间。只有当涉及控制器时,umlaut才会出现问题,直接链接到JSP的链接可以正常显示umlaut,如果它们通过控制器,则无法正确显示。 - fred basset

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接