使用 RequestDispatcher.include() 时 JSP 和 Spring 中的编码问题

Encoding issues in JSP with Spring when RequestDispatcher.include() is used

在我的应用程序中有一堆消息包作为属性文件。通过 <spring:message code="code.here"> 在 JSP 文件中查找消息。这有效,所有特殊字符都在浏览器中按应有的方式呈现。

现在我需要在其中一个 JSP 文件中添加一些额外的逻辑,并在其位置添加一个 servlet 来完成它的工作并使用 req.getRequestDispatcher("/jsp/some_file.jsp").include(req, resp); 呈现 JSP。

这大部分都有效,但现在所有特殊字符(在我的例子中是德语变音符号)都被破坏了。由于某种原因,消息标签中的变音符号呈现不正确。例如,单词 "ungültig" 输出为

00000000  75 6e 67 ef bf bd 6c 74  69 67 0a                 |ung...ltig.|

在浏览器中。我知道这是一个 UTF-8 encoded Unicode replacement character 但我不知道它为什么在那里。

资源文件都有正确的编码,事实上,为了安全起见,我们的资源文件都是ASCII,"ungültig"实际上编码为ung\u00FCltig,其中0xFC is the encoding of ü in ISO-8859-1 根据定义,这是 Java 的属性文件所需的编码。

我不知道为什么会这样。为什么突然渲染不正确,我该如何解决?

解决方案是,出于某种我不知道的原因,在使用请求调度程序时忽略了 JSP 的 header 中有关编码的指令。

有两种解决方法:

  1. 使用 resp.setCharacterEncoding("UTF-8") 在 servlet 中显式设置编码。
  2. 将Spring的CharacterEncodingFilter的参数forceEncoding的值设置为真,例如

    <filter>
        <filter-name>encoding-filter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter
        </filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    

我用的是第二种方法。我不确定这是否有任何意想不到的副作用,但目前看来效果很好。