我正在使用 spring mvc。我已经设置了一个具有两个简单文本输入的网络表单。在控制器上,我使用 @ModelAttribute 让 spring 从 Web 表单构建 bean。
当用户在这些文本字段中输入特殊字符(例如酒店之类的字符)时,问题就出现了,spring 不会将其读取为 utf-8,并且它们会变成通常的错误编码字符串。
我检查了 web.xml,有 utf-8 编码过滤器,所有页面都标记为 utf-8,并且浏览器正在发送正确的字符集标头。知道发生了什么事吗?
您可能想检查一下: http://forum.springsource.org/showthread.php?81858-ResponseBody-and-UTF-8
缺点是,如果您使用带注释的方法,那么所使用的消息转换器具有默认字符集。您可以通过设置支持的媒体类型在 web.xml 中更改此设置。
但是,如果您的服务不喜欢该媒体类型,您可能会收到 406 错误。您可以创建自己的字符串消息转换器并设置默认编码,但是使用内置的 HttpStringMessageConverter 没有简单的方法。
或者,您可以将字符串重新编码为不同的字符集:
String newresponse = new String(responseString.getBytes("ISO-8859-1"), "UTF-8");
您可能还想在此处查看相关问题:如何让 UTF-8 在 Java Web 应用程序中工作?
解决方案很简单,通过添加 Produce = "text/plain;charset=UTF-8" 来请求映射,您可以强制 spring mvc 对返回的文本进行编码。
我在使用 @ModelAttribute 获取模型作为控制器方法的参数时遇到了类似的问题。然后我在 chatgpt 的帮助下找到了一个简单的解决方案。
只需将此设置添加到您的 web.xml 文件即可。
如果你想将unicode从jsp传递到java那么:
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value> <!-- Set the desired character encoding -->
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern> <!-- Apply the filter to all URLs -->
</filter-mapping>
如果你想从java传递unicode字符到jsp:
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<page-encoding>UTF-8</page-encoding>
</jsp-property-group>
</jsp-config>
encodingFilter 强制将字符编码为 UTF-8(您可以将其更改为任何其他编码)。 jsp-config 将页面编码应用于所有 jsp 页面,而不是在所有页面中单独指定页面编码。它帮助jsp正确渲染unicode字符。