带有 Thymeleaf 的 utf8 字符集
Posted
技术标签:
【中文标题】带有 Thymeleaf 的 utf8 字符集【英文标题】:utf8 charset with Thymeleaf 【发布时间】:2016-07-23 16:09:03 【问题描述】:当使用带有 Thymeleaf 的 Spring 时,我所有的西里尔字符在页面上都显示为 ?????
。
使用
@RequestMapping(value = "/login", method = RequestMethod.GET, produces = "text/html; charset=utf-8")
正如这里建议的那样:https://***.com/a/11866822/1479414 和这里:https://***.com/a/12023816/1479414 没有帮助。
如何解决这个问题?
【问题讨论】:
【参考方案1】:可以在here找到答案:
应为templateResolver
和ThymeleafViewResolver
明确设置属性characterEncoding
:
<bean id="templateResolver" class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
...
<property name="characterEncoding" value="UTF-8"/>
...
</bean>
<bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
...
<property name="characterEncoding" value="UTF-8"/>
...
</bean>
【讨论】:
我已经更改了这两个设置,但 unicode 字符仍然无法正确呈现。是否还有其他可能配置错误的设置? 我不知道。我已经两年没有使用 Tapestry 了。可能是从那以后发生了一些变化【参考方案2】:为我工作。 java配置
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.projectName.controller")
public class MVCConfig implements WebMvcConfigurer, ApplicationContextAware
@Autowired
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws
BeansException
this.applicationContext = applicationContext;
@Bean
public ViewResolver viewResolver()
ThymeleafViewResolver thymeleafViewResolver = new ThymeleafViewResolver();
thymeleafViewResolver.setTemplateEngine(templateEngine());
thymeleafViewResolver.setCharacterEncoding("UTF-8");
return thymeleafViewResolver;
@Bean
public TemplateEngine templateEngine()
SpringTemplateEngine springTemplateEngine = new SpringTemplateEngine();
springTemplateEngine.setEnableSpringELCompiler(true);
springTemplateEngine.setTemplateResolver(templateResolver());
return springTemplateEngine;
@Bean
public ITemplateResolver templateResolver()
SpringResourceTemplateResolver springResourceTemplateResolver = new
SpringResourceTemplateResolver();
springResourceTemplateResolver.setApplicationContext(applicationContext);
springResourceTemplateResolver.setPrefix("/WEB-INF/views/");
springResourceTemplateResolver.setTemplateMode(TemplateMode.HTML);
springResourceTemplateResolver.setSuffix(".html");
springResourceTemplateResolver.setCharacterEncoding("UTF-8");
return springResourceTemplateResolver;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry)
registry
.addResourceHandler("/resources/**")
.addResourceLocations("/resources/");
【讨论】:
欢迎来到 Stack Overflow!请不要只用源代码回答。尝试对您的解决方案如何工作提供一个很好的描述。请参阅:How do I write a good answer?。谢谢【参考方案3】:在配置中
public class SpringConfig implements WebMvcConfigurer
private final ApplicationContext applicationContext;
@Autowired
public SpringConfig(ApplicationContext applicationContext)
this.applicationContext = applicationContext;
@Bean
public SpringResourceTemplateResolver templateResolver()
SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
templateResolver.setApplicationContext(applicationContext);
templateResolver.setPrefix("/WEB-INF/views/");
templateResolver.setSuffix(".html");
templateResolver.setCharacterEncoding("UTF-8");
return templateResolver;
@Bean
public SpringTemplateEngine templateEngine()
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver());
templateEngine.setEnableSpringELCompiler(true);
return templateEngine;
@Override
public void configureViewResolvers(ViewResolverRegistry registry)
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(templateEngine());
resolver.setCharacterEncoding("UTF-8");
registry.viewResolver(resolver);
在 ServletInitializer 中
public class MySpringMvcDispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer
@Override
protected Class<?>[] getRootConfigClasses()
return null;
@Override
protected Class<?>[] getServletConfigClasses()
return new Class[]SpringConfig.class;
@Override
protected String[] getServletMappings()
return new String[]"/";
@Override
protected Filter[] getServletFilters()
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
filter.setForceEncoding(true);
return new Filter[] filter ;
【讨论】:
这一切都很好,直到 Filter[] getServletFilters(),它不在 AbstractAnnotationConfigDispatcherServletInitializer 中,而是在 AbstractDispatcherServletInitializer 中。你是如何覆盖它的? @psyopus Link to documentation。 AbstractAnnotationConfigDispatcherServletInitializer 扩展了 AbstractDispatcherServletInitializer【参考方案4】:如果您在视图解析器的 bean 配置中添加了 <property name="characterEncoding" value="UTF-8"/>
并且仍然没有以正确的格式显示文本,则问题出在 properties/resource_bundle 文件中。
尝试使用 native2ascii 工具对 UTF-8 或非英文字符进行编码。 (它包含在 java_home/bin 文件夹中。
【讨论】:
【参考方案5】:在我的例子中,我在 application.properties 文件中放了 2 行以下
spring.thymeleaf.enabled=true
spring.thymeleaf.encoding=UTF-8
(韩文)参考:https://blog.thjang.net/33
【讨论】:
【参考方案6】:我认为在 thymeleaf html 页面中,您正在使用带有 html 元素的 th:text,th:text 它只显示普通文本,
如果你想在你的 thymeleaf html 页面上使用特殊的章程,那么只需要改变例如
th:utext="$yourcontroller_var"
或
th:utext="#properties_var"
例如
<div th:utext="$user.name"> Test! </div> // for your controller variable
还有
<div th:utext="#message.username"> UserName! </div> // for your properties variable
在 thymeleaf html 页面中使用特殊字符没有其他配置。
希望你能解决你的问题
【讨论】:
你错了,当页面有静态文本且文件为utf-8
编码时,这将无法解决问题。
@Andremoniy 什么可以解决这个问题?以上是关于带有 Thymeleaf 的 utf8 字符集的主要内容,如果未能解决你的问题,请参考以下文章