SpringBoot中文乱码问题解决方案汇总

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

SpringBoot中⽂乱码问题解决⽅案汇总
使⽤ Spring Boot 开发,对外开发接⼝供调⽤,传⼊参数中有中⽂,出现中⽂乱码,查了好多资料,总结解决⽅法如下:
第⼀步,约定传参编码格式
不管是使⽤httpclient,还是okhttp,都要设置传参的编码,为了统⼀,这⾥全部设置为utf-8
第⼆步,修改application.properties⽂件
增加如下配置:
spring.http.encoding.force=true
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
server.tomcat.uri-encoding=UTF-8
此时拦截器中返回的中⽂已经不乱码了,但是controller中返回的数据依旧乱码。

第三步,修改controller的@RequestMapping
修改如下:
produces="text/plain;charset=UTF-8"
这种⽅法的弊端是限定了数据类型,继续查找资料,在stackoverflow上发现解决办法,是在配置类中增加如下代码:
@Configuration
public class CustomMVCConfiguration extends WebMvcConfigurerAdapter {
@Bean
public HttpMessageConverter<String> responseBodyConverter() {
StringHttpMessageConverter converter = new StringHttpMessageConverter(
Charset.forName("UTF-8"));
return converter;
}
@Override
public void configureMessageConverters(
List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters(converters);
converters.add(responseBodyConverter());
}
@Override
public void configureContentNegotiation(
ContentNegotiationConfigurer configurer) {
configurer.favorPathExtension(false);
}
}
便可以解决SpringBoot的中⽂乱码问题了。

ps:stackoverflow⽹址
在⼯作中新使⽤springboot 然后遇到了乱码问题 springboot 的配置⽂件⽅式和之前的srping mvc 有很⼤不同就让我很是困惑,先讲解我们开始使⽤的解决⽅案:在application.properties 中增加
spring.http.encoding.force=true spring.http.encoding.charset=UTF-8 spring.http.encoding.enabled=true server.tomcat.uri-encoding=UTF-8⽤来解决乱码问题
然后发现在拦截器中返回的中⽂已经不乱码了。

在后续测试中发现controller中返回的数据依旧乱码,于是在 @RequestMapping中增加produces="text/plain;charset=UTF-8"
但是总觉得要限定了请求的数据类型,所以继续研究,然后在查找的时候发现了HttpMessageConverter类,在其中的⽅法
protected Long getContentLength(String str, MediaType contentType) { Charset charset = this.getContentTypeCharset(contentType);
try {
return Long.valueOf((long)str.getBytes(()).length);
} catch (UnsupportedEncodingException var5) {
throw new IllegalStateException(var5);
}
} 和 private Charset getContentTypeCharset(MediaType contentType) { return contentType != null && contentType.getCharset() != null?
contentType.getCharset():this.getDefaultCharset(); }
中发现 getContentTypeCharset的MediaType是⼊参的数据⾥⾯的utf-8然后在getContentLength的MediaType 的编码是ISO-8859-1 看了下这个类中 ublic static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1"); 所以下⾯的主要⼯作就是修改这个默认编码然后找到了下⾯两篇⽂章
package com.kotlin.springboot.nextj2ee.config
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.http.converter.HttpMessageConverter
import org.springframework.http.converter.StringHttpMessageConverter
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter
import java.nio.charset.StandardCharsets
@Configuration
class CustomMVCConfiguration : WebMvcConfigurerAdapter() {
@Bean
fun responseBodyConverter(): HttpMessageConverter<String> {
return StringHttpMessageConverter(StandardCharsets.UTF_8)
}
override fun configureMessageConverters(
converters: MutableList<HttpMessageConverter<*>>) {
super.configureMessageConverters(converters)
converters.add(responseBodyConverter())
}
override fun configureContentNegotiation(
configurer: ContentNegotiationConfigurer) {
configurer.favorPathExtension(false)
}
}
完美解决了乱码问题。

相关文档
最新文档