带有 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找到答案:

应为templateResolverThymeleafViewResolver 明确设置属性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 配置中添加了 &lt;property name="characterEncoding" value="UTF-8"/&gt; 并且仍然没有以正确的格式显示文本,则问题出在 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 字符集的主要内容,如果未能解决你的问题,请参考以下文章

带有 UTF8 字符的友好 URL

PL/SQL:带有 UTF8 字符串的 UTL_HTTP POST 导致字符损坏

Thymeleaf 获取当前登录的用户名作为字符串

utf-8无bom和utf-8啥区别

在utf8字符集中一个中文字符占几个字节

带有动态列和过程的 mariadb utf8mb4