servlet应用程序中的Unicode字符显示为问号

时间:2012-10-28 11:36:48

标签: jsp servlets character-encoding internationalization jstl

最近,我实施了基于How to internationalize a Java web application?的国际化。

但是现在我在某些页面遇到了问题。如果它是英语,则表现良好,但如果我们选择任何其他语言,则该页面中的所有值都显示为?????????

image

我已检查过服务器日志中的异常,但我找不到任何人。

这是如何引起的?如何解决?

2 个答案:

答案 0 :(得分:2)

看到??????而不是可理解的字符(甚至代替Mojibake)通常表明负责的数据传输本身非常了解源和目标中使用的编码。在普通的Web应用程序中,只有两个地方出现这种情况:数据通过JDBC传输到数据库或从数据传输到数据库的时间点以及数据通过response.getWriter()传输到HTTP响应的时间点(如JSP隐式使用。)

在具有属性文件的特定情况下,无法使用数据库,因此HTTP响应仍然是主要的嫌疑人。如果未指示服务器使用UTF-8解码正在写入HTTP响应的字符,而是使用某些平台默认编码(最常见的是ISO-8859-1),则会发生此问题。这样,源ISO-8859-1中不是covered的任何字符都将变成问号。由于ISO-8859-1专门用于拉丁字符,因此会影响所有非拉丁字符,如中文,日文,阿拉伯文,西里尔文,希伯来文,梵文等。它们都会被写成问号。

这可以通过在JSP的最顶层添加以下内容来修复每个JSP:

<%@page pageEncoding="UTF-8" %>

(请注意,您确实需要将其放在每个 JSP中,也包括包含文件!)

或者,更好的是,通过在webapp的web.xml中添加以下条目,在应用程序范围内修复它:

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <page-encoding>UTF-8</page-encoding>
    </jsp-property-group>
</jsp-config>

另见:

答案 1 :(得分:0)

实际上,在调度响应之前,我们在servlet中缺少一行。

即。我们忘了设置内容类型。

以下是要包含在servlet中的代码

response.setContentType("text/html;charset=UTF-8");

由于