You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring/Thymeleaf西里尔文显示乱码,UTF-8配置无效求助

解决Spring/Thymeleaf西里尔文乱码问题:框架级UTF-8配置方案

我在浏览器向服务器传递信息时出现“????”乱码,排查过网络资源及StackOverflow仍未解决,推测Spring/Thymeleaf仍在使用ISO_8859_1而非UTF-8编码。

更新:控制台中的西里尔文全部乱码,比如原内容“Текстовая строка123”显示为“???µ???????????°?? ???????????°123”,非西里尔字符显示正常。目前虽可通过手动转码临时解决:

byte[] bytes = content.getBytes(StandardCharsets.ISO_8859_1);
content = new String(bytes, StandardCharsets.UTF_8);

但希望直接由框架处理UTF-8编码,无需手动转码。


现有配置代码

1. DispatcherServlet(字符编码Filter配置)

public class DispatcherServlet extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    public void onStartup(ServletContext aServletContext) throws ServletException {
        super.onStartup(aServletContext);
        registerCharacterEncodingFilter(aServletContext);
        registerHiddenFieldFilter(aServletContext);

    }

    private void registerHiddenFieldFilter(ServletContext aContext) {
        aContext.addFilter("hiddenHttpMethodFilter",
                new HiddenHttpMethodFilter()).addMappingForUrlPatterns(null, true, "/*");
    }

    private void registerCharacterEncodingFilter(ServletContext aContext) {
        EnumSet<DispatcherType> dispatcherTypes = EnumSet.of(DispatcherType.REQUEST,
        DispatcherType.FORWARD);

        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        characterEncodingFilter.setForceEncoding(true);

        FilterRegistration.Dynamic characterEncoding = aContext.addFilter("characterEncoding",
        characterEncodingFilter);
        characterEncoding.addMappingForUrlPatterns(dispatcherTypes, true, "/*");
    }

}

2. 应用配置类(ApplicationConfiguration)

public class ApplicationConfiguration implements WebMvcConfigurer {

    private final ApplicationContext applicationContext;

    private final Environment environment;

    @Autowired
    public ApplicationConfiguration(ApplicationContext applicationContext, 
    Environment environment) {

        this.applicationContext = applicationContext;
        this.environment = environment;
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry resourceHandlerRegistry) {
        resourceHandlerRegistry.addResourceHandler("/resources/**").
        addResourceLocations("/resources/");
    }

    // Thymeleaf 解析器、引擎等配置
    @Bean
    public SpringResourceTemplateResolver templateResolver() {
        SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
        resolver.setApplicationContext(applicationContext);
        resolver.setPrefix("/WEB-INF/view/");
        resolver.setSuffix(".html");
        resolver.setCharacterEncoding("UTF-8");
        resolver.setTemplateMode("HTML5");
        return resolver;
    }

    @Bean
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine engine = new SpringTemplateEngine();
        engine.setTemplateResolver(templateResolver());
        engine.addDialect(new SpringSecurityDialect());
        engine.setEnableSpringELCompiler(true);
        return engine;
    }

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        ThymeleafViewResolver resolver =  new ThymeleafViewResolver();
        resolver.setTemplateEngine(templateEngine());
        resolver.setContentType("text/html; charset=UTF-8");
        resolver.setCharacterEncoding("UTF-8");
        registry.viewResolver(resolver);
    }
}

框架级UTF-8配置补充方案

1. 调整Servlet容器编码(以Tomcat为例)

在server.xml的Connector节点添加URI编码配置,确保容器接收请求时直接用UTF-8解析参数:

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           URIEncoding="UTF-8" />

2. 优先注册字符编码Filter

修改DispatcherServlet的onStartup方法,将字符编码Filter的注册放在最前面,保证其执行优先级高于其他Filter:

@Override
public void onStartup(ServletContext aServletContext) throws ServletException {
    // 先注册字符编码Filter,确保最先执行
    registerCharacterEncodingFilter(aServletContext);
    super.onStartup(aServletContext);
    registerHiddenFieldFilter(aServletContext);
}

3. 配置全局消息转换器

在ApplicationConfiguration中添加消息转换器配置,强制所有请求响应使用UTF-8:

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    StringHttpMessageConverter stringConverter = new StringHttpMessageConverter(StandardCharsets.UTF_8);
    stringConverter.setWriteAcceptCharset(false); // 禁用字符集协商,强制输出UTF-8
    converters.add(stringConverter);
}

4. 检查模板页面编码

确保Thymeleaf模板的<head>中声明UTF-8编码,且文件本身以UTF-8无BOM格式保存:

<meta charset="UTF-8">

5. 修复控制台输出编码

添加JVM启动参数,强制控制台输出UTF-8:

-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8

IDE中可在Run/Debug配置的VM参数中添加,部署环境则在启动脚本中加入。


内容的提问来源于stack exchange,提问作者KRL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 11:40:31