使用 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 中有关编码的指令。
有两种解决方法:
- 使用
resp.setCharacterEncoding("UTF-8")
在 servlet 中显式设置编码。
将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>
我用的是第二种方法。我不确定这是否有任何意想不到的副作用,但目前看来效果很好。
在我的应用程序中有一堆消息包作为属性文件。通过 <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 中有关编码的指令。
有两种解决方法:
- 使用
resp.setCharacterEncoding("UTF-8")
在 servlet 中显式设置编码。 将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>
我用的是第二种方法。我不确定这是否有任何意想不到的副作用,但目前看来效果很好。