我也遇到過與顯示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;
}
希望這可以幫助你:)