【问题标题】:utf8 charset with Thymeleaf带有 Thymeleaf 的 utf8 字符集
【发布时间】:2016-07-23 16:09:03
【问题描述】:

当使用带有 Thymeleaf 的 Spring 时,我所有的西里尔字符在页面上都显示为 ?????

使用

@RequestMapping(value = "/login", method = RequestMethod.GET, produces = "text/html; charset=utf-8")

正如这里建议的那样:https://stackoverflow.com/a/11866822/1479414 和这里:https://stackoverflow.com/a/12023816/1479414 没有帮助。

如何解决这个问题?

【问题讨论】:

    标签: java spring spring-mvc utf-8 thymeleaf


    【解决方案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 什么可以解决这个问题?
        猜你喜欢
        • 2023-03-11
        • 1970-01-01
        • 2018-01-09
        • 2017-02-14
        • 2011-10-20
        • 1970-01-01
        • 1970-01-01
        • 2016-11-21
        • 1970-01-01
        相关资源
        最近更新 更多