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")); } 

要解决这个问题,你需要以下三个步骤:

  1. 将页面编码设置为UTF-8,如下所示:

     <%@ page language="java" pageEncoding="UTF-8"%> <%@ page contentType="text/html;charset=UTF-8" %> 
  2. 在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> 
  3. 将资源编码设置为UTF-8,以防直接在Java代码或JSP中编写任何UTF-8字符。