带有 Thymeleaf 的 utf8 字符集

utf8 charset with Thymeleaf

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

使用

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

正如这里所建议的那样: and here: 没有帮助。

如何解决这个问题?

答案可见here:

属性 characterEncoding 应明确设置为 templateResolverThymeleafViewResolver:

<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>

我认为在 thymeleaf html 页面中,您正在使用 th:text 和 html 元素,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 页面中使用特殊字符无需进行其他配置。

希望你能解决问题

为我工作。 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/");
   }
}

如果您在视图解析器的 bean 配置中添加了 <property name="characterEncoding" value="UTF-8"/>,但仍然没有以正确的格式显示文本,那么问题出在 properties/resource_bundle 文件中。

尝试使用 native2ascii 工具对 UTF-8 或非英语字符进行编码。 (它包含在 java_home/bin 文件夹中。

在配置中

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 };
    }
}

在我的例子中,我在 application.properties 文件中放置了以下 2 行

spring.thymeleaf.enabled=true
spring.thymeleaf.encoding=UTF-8

(韩语)参考:https://blog.thjang.net/33

使用 Spring WebFlux,我限制视图解析器使用 text/html; charset=UTF-8 作为唯一支持的内容类型。我为此使用了自定义 WebFluxConfigurer(在 Kotlin 中):

class CustomWebFluxConfigurer(
    private val viewResolver: ThymeleafReactiveViewResolver
) : WebFluxConfigurer {
    override fun configureViewResolvers(registry: ViewResolverRegistry) {
        viewResolver.supportedMediaTypes =
            listOf(MediaType.parseMediaType("text/html; charset=UTF-8"))
        registry.viewResolver(viewResolver)
    }
}