在使用 spring 框架和 freemarker 模板时,我也遇到了显示 UTF-8 字符(如 æ.ø 和 å 等特殊字符)的问题。
我所做的是。
1.确保您的 .ftl 页面使用 utf-8 编码
这是确保未使用 UTF-8 字符集编码的页面可能显示错误数字的重要事项,即使您设置了所有其他要求。检查您的 IDE 设置,找出它将文件设置为的默认编码。然而,我认为今天 Eclipse 和 NetBeans 都将所有文件都设置为 UTF-8 编码作为标准。您必须确保它是 UTF-8 编码,没有 BOM。
2。在模板文件中包含 Meta 标记以设置字符集
在包含 <head> 标记的模板 (.ftl) 文件中,设置 <meta>,其属性为 charset="UTF-8"。这是如果您使用 HTML 5。如果您使用 xhtml 或 HTML 4,您的元标记需要看起来像这样
- 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, "/*");
}
web.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 和 FreeMarkerViewResolver 中将它们的属性设置为 UTF-8 来完成的。这是在您的 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;
}
希望对你有所帮助:)