Spring MVC UTF-8编码
目前我正在尝试使用Spring MVC。 在尝试的时候遇到了一个编码问题。
我想在JSP页面上显示UTF-8字符,所以我添加了一个带有UTF-8字符的string到我的ModelAndView。 它看起来像这样:
@Controller public class HomeController { private static final Logger logger = LoggerFactory.getLogger(HomeController.class); @RequestMapping(value="/", method=RequestMethod.GET) public ModelAndView home() { logger.info("Welcome home!"); return new ModelAndView("home", "utftest", "ölm"); } }
在JSP页面上,我只想显示带有UTF-8字符的string,如下所示:
<%@ page language="java" pageEncoding="UTF-8"%> <%@ page contentType="text/html;charset=UTF-8" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ page session="false" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Home</title> </head> <body> <h1>Hello world!</h1> <p><c:out value="ö" /></p> <p><c:out value="${utftest}"></c:out></p> </body> </html>
结果我得到如下:
Hello world! ö √∂lm
请注意,以下代码<c:out value="ö" />
显示时没有编码错误。 我还在Springsource Tool Suite中将默认编码设置为UTF-8,但是我仍然收到错误的字符。
编辑:
也许我应该提到我正在使用OS X 10.6的Mac。 对于Spring开发,我使用Spring的Springsource Tool Suite(http://www.springsource.com/developer/sts)。 希望这有助于找出我的设置有什么问题。
编辑2:
感谢McDwell,我刚刚在我的控制器中使用了"\u00f6lm"
而不是"ölm"
,JSP页面上的编码问题就没有了。
这是否意味着我的.java文件使用错误的字符集编码? 我在哪里可以改变这在Eclipse?
谢谢。
确保你的web.xml
注册了Spring的CharacterEncodingFilter
。
<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> </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> </filter-mapping>
如果你在Tomcat上,你可能没有在你的server.xml
设置URIEncoding
。 如果您没有将其设置为UTF-8,则不起作用。 绝对保持CharacterEncodingFilter
。 不过,这里有一个简洁的清单 。 它一定会指导你做这个工作。
好吧,我发现我的编码问题的原因。
这个错误在我的构build过程中。 我没有告诉Maven在我的pom.xml
文件中使用UTF-8编码构build项目。 为此,Maven从我的MacRoman系统中获取了默认编码,并使用MacRoman编码构build它。
幸运的是Maven在构build项目时警告你(但是由于所有其他消息,很有可能警告从屏幕快速消失)。
这是您需要在pom.xml
文件中设置的属性:
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> ... </properties>
谢谢你们的帮助。 没有你们,我无法弄清楚这一点!
除了Benjamin的回答(我只是略过了),你需要确保你的文件实际上是使用正确的编码(对于源代码,JSP等是UTF-8),但是请注意Java属性文件必须按照定义编码为ISO 8859-1)。
这个问题是,不可能知道用什么编码来存储文件。 唯一的select是使用特定的编码打开文件,并检查内容是否有意义。 您也可以尝试使用iconv将文件从假定的编码转换为所需的编码 – 如果这样会产生错误,那么您的假设是不正确的。 因此,如果您认为hello.jsp编码为UTF-8,请运行“iconv -f UTF-16 -t UTF-8 hello.jsp”并检查错误。
如果你发现你的文件编码不正确,你需要找出原因。 这可能是您用来创build文件的编辑器或IDE。 在Eclipse(和STS)的情况下,确保文本文件编码(首选项/常规/工作区)设置为UTF-8(不幸的是默认为系统的平台编码)。
是什么使得编码问题变得如此难以debugging,就是涉及到太多的组件(文本编辑器,borwser,以及其间的每个软件组件,在某些情况下包括数据库),并且每个组件都有可能引入错误。
右键单击到您的controller.java然后属性,并检查您的文本文件是否使用UTF-8编码,如果不是这是您的错误。
根据您呈现视图的方式,您可能还需要:
@Bean public StringHttpMessageConverter stringHttpMessageConverter() { return new StringHttpMessageConverter(Charset.forName("UTF-8")); }
要解决这个问题,你需要以下三个步骤:
-
将页面编码设置为UTF-8,如下所示:
<%@ page language="java" pageEncoding="UTF-8"%> <%@ page contentType="text/html;charset=UTF-8" %>
-
在web.xml文件中设置filter如下:
<filter> <filter-name>encodingFilter</filter-name> <filter-lass>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> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
-
将资源编码设置为UTF-8,以防直接在Java代码或JSP中编写任何UTF-8字符。