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
相关产品推荐
相关产品推荐

