【发布时间】:2026-02-10 14:25:02
【问题描述】:
我正在开发一个 Spring JSR 286 Portlet 应用程序。语言环境由登录时加载的默认语言设置驱动。
然后我需要通过 portlet 进行货币格式化。例如,我执行以下操作:
<fmt:setLocale value="en_IE" />
result: <fmt:formatNumber type="currency" value="324.00" currencyCode="EUR" />
(通常,所有这些值都是动态设置的。)
当我进行正常操作时,这会产生很好的结果。
result: €324.00
除了在应用程序中,当我发出@ResourceMapping 请求时。在这种情况下,并且仅在这里,我得到:
result: ?324.00
我在为RenderRequests 渲染的jsp 和为ResourceRequests 渲染的jsp 中有相同的两行。但无论我做什么,它总是无法产生干净的输出作为ResourceRequest 的一部分。
关于什么可能导致不一致的任何想法?
第二次编辑:
根据 +BalusC 的第二条评论,我将以下内容放入 jsp:
<% System.out.println("Response Char Encoding: " + response.getCharacterEncoding()); %>
对于常规请求,我得到:
SystemOut O Response Char Encoding: UTF-8
对于渲染请求,它不起作用,我得到:
SystemOut O Response Char Encoding: ISO-8859-1
所以,是的,正如预测的那样,这是一个字符编码问题。
--
编辑 3:
所以,问题是如何在 ResourceResponse 的 Spring 中设置 UTF-8 的字符编码。
加入<%@page pageEncoding="UTF-8"%> 的页面指令不会覆盖上面看到的默认编码。将其直接构建到 Spring 中的方法是复杂的 hack(请参阅 Spring Encoding with CharacterEncodingFilter in web.xml ),鉴于我只有少数资源请求方法,似乎最简单的方法就是放
response.setCharacterEncoding("UTF-8");
进入那些方法。
不胜感激任何其他建议,尤其是如果我对如何更轻松地将其放入 Spring 有误。
【问题讨论】:
-
问号而不是“特殊字符”通常表示字符编码问题。在您的特定示例中,问号表示所需的字符未包含在响应被告知使用的字符编码中。您应该尝试验证是否所有可能的字符编码设置都设置为同一种编码,现在应该是 UTF-8。我不能发布更详细的答案如何配置它,因为我不做 Portlets。
-
根据您的编辑,您应该对 response 字符编码感兴趣,而不是对请求编码感兴趣。因此,
response.getCharacterEncoding()。对于普通 servlet 环境中的 JSP,您可以通过将<%@page pageEncoding="UTF-8"%>置于 JSP 顶部(或通过应用程序范围的web.xml设置)来控制此值。但同样,我不确定 portlet 是如何发挥作用的。 -
@BalusC 谢谢——我的愚蠢错误是切换请求和响应。结果和预期的一样。现在尝试看看是否有“Spring”的方式来设置响应的字符编码,或者直接把它放在方法中。
-
那么
<%@page pageEncoding="UTF-8"%>解决了问题?您需要一种方法将其应用于所有 JSP 吗? Portlet 是否有web.xml? -
@BalusC
<%@ page指令不起作用。这是一个足够小的用例,我只是要对其进行硬编码——不是很好,但对于这个客户端来说,这是一个非常小的问题。请参阅上面的编辑。
标签: jsp spring-mvc jstl portlet