我也遇到过与显示UTF-8字符(特殊字符,如æ问题O和a等。 ),当使用spring框架和freemarker模板时。
我做的是。
1.确保.ftl页面编码使用UTF-8 这是为了确保一个重要的事情,那不是UTF-8字符集编码的页面,可能会显示错误的号码,即使你拥有所有其他要求设置。检查你的IDE设置,找出它设置文件的默认编码。不过今天我认为Eclipse和NetBeans都将UTF-8编码的所有文件设置为标准。您必须确保它在没有BOM的情况下编码UTF-8。
2.包括Meta标记在模板文件中设置的字符集 在模板(.ftl)文件,其中包含你的<head>
标签,设置<meta>
,与属性charset="UTF-8"
。这是如果你如果你使用XHTML或HTML 4使用HTML 5,你的meta标签需要像这样
- HTML 5
<meta charset="UTF-8" />
- HTML 4/XHTML
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
3。确保在部署描述符文件中设置了字符编码过滤器 您必须通过字符编码过滤器过滤所有传入/传出请求。此过滤器在部署描述符(web.xml /或与java相同的WebApplicationInitializer)中设置。
WebApplicationInitializer(Java文件)
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
registerCharacterEncodingFilter(servletContext);
}
/**
* Filter all incoming requests with character encoding UTF-8
* @param servletContext
*/
private void registerCharacterEncodingFilter(ServletContext servletContext) {
CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
encodingFilter.setEncoding("UTF-8");
encodingFilter.setForceEncoding(true);
FilterRegistration.Dynamic characterEncodingFilter = servletContext.addFilter("characterEncodingFilter", encodingFilter);
characterEncodingFilter.addMappingForUrlPatterns(null, false, "/*");
}
网络。XML
<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>
4.设置配置者和视图解析器FreeMarker的字符编码 你也需要让所有的FreeMarker文件是标准的编码与UTF-8,这是由它们的属性设置为完成FreeMarkerConfigurer中的UTF-8和FreeMarkerViewResolver。这是在你的spring应用程序上下文文件中设置的(我只会显示Java的等价物,因为它在XML文件中是相同的)。
/**
* FreeMarker Configurer will help configure different settings of
* the FreeMarker template engine.
*
* @return an object of the FreeMarkerConfigurer class.
*/
@Bean
public FreeMarkerConfigurer freemarkerConfig() {
FreeMarkerConfigurer freeMarkerConfigurer = new FreeMarkerConfigurer();
freeMarkerConfigurer.setTemplateLoaderPath("/templates/");
freeMarkerConfigurer.setDefaultEncoding("UTF-8");
return freeMarkerConfigurer;
}
/**
* The View resolver to use when resolving FreeMarker views.
*
* @return the View Resolver Object used to resolve FreeMarker views.
*/
@Bean
public FreeMarkerViewResolver viewResolver() {
FreeMarkerViewResolver viewResolver = new FreeMarkerViewResolver();
viewResolver.setPrefix("");
viewResolver.setSuffix(".ftl");
viewResolver.setCache(false); //Set to true during production
viewResolver.setContentType("text/html;charset=UTF-8");
return viewResolver;
}
希望这可以帮助你:)