У меня также возникла проблема с отображением символов UTF-8 (специальных символов, таких как æ. Ø и å и т. Д.), При использовании Spring Framework и шаблона Freemarker.
То, что я сделал, было.
1. Убедитесь, что ваша страница .ftl имеет кодировку utf-8
Это важно для того, чтобы страница, не закодированная в кодировке UTF-8, могла показывать неправильные числа, даже если у вас установлены все другие требования. Проверьте настройки IDE, чтобы узнать, какой кодировке по умолчанию она устанавливает ваши файлы. Однако сегодня я думаю, что Eclipse и NetBeans устанавливают все файлы с кодировкой UTF-8 в качестве стандарта. Вы должны убедиться, что это кодировка UTF-8 без спецификации.
2. Включите метатег в файл шаблона, чтобы установить кодировку
В файле шаблона (.ftl), в котором содержится тэг <head>
, установите <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, это делается путем установки их свойств в UTF-8 в FreeMarkerConfigurer и 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;
}
Надеюсь, это поможет вам:)