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

使用 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网址

http://stackoverflow.com/questions/27606769/how-to-overwrite-stringhttpmessageconverter-default-charset-to-use-utf8-in-sprin

http://stackoverflow.com/questions/20935969/make-responsebody-annotated-spring-boot-mvc-controller-methods-return-utf-8

在工作中新使用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(charset.name()).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");
所以下面的主要工作就是修改这个默认编码
然后找到了下面两篇文章

http://stackoverflow.com/questions/20935969/make-responsebody-annotated-spring-boot-mvc-controller-methods-return-utf-8
http://stackoverflow.com/questions/27606769/how-to-overwrite-stringhttpmessageconverter-default-charset-to-use-utf8-in-sprin

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

完美解决了乱码问题

如果觉得我的

作者:一个会写诗的程序员
链接:https://www.jianshu.com/p/718826aee249
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

原文地址:https://www.cnblogs.com/telwanggs/p/10779833.html

时间: 2024-11-06 07:28:10

Spring Boot 中文乱码问题解决方案汇总的相关文章

解决spring boot中文乱码问题

在开发或学习当中,我们不可避免的会碰到中文乱码的问题(好想哭,但还是要保持微笑!) 今天,在学习spring boot中碰到了中文乱码问题. 首先,看了一下workspace是不是设置utf-8默认字符集: 1)看了下没有,设置工作空间字符集为utf-8默认.(http://www.cnblogs.com/lhns/p/8901968.html) 2)发现没有效果. 3)在传值的地址上限制它的字符集格式: 这时候就显示正常了: 下次再看下有没有关于设置配置文件的修改,再给大家提供下思路.....

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 此时拦截器中返回的中文

Spring MVC 结合Velocity视图出现中文乱码的解决方案

编码问题一直是个很令人头疼的事,这几天搭了一个Spring MVC+VTL的web框架,发现中文乱码了,这里记录一种解决乱码的方案. 开发环境为eclipse,首先,检查Window->preferences->workplace->Text File Encoding,设置为GBK .vm文件中加入编码约束,举例如下 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Typ

Eclipse工程,中文乱码问题解决方案

Eclipse工程,中文乱码问题解决方案 将工程的属性设置为GBK: 如果一个工程家里的时候是按照GBK,而Eclipse默认的编码是UTF-8,所以如果导入的工程是GBK,则可以将工程更改为UTF-8试试: 如果还是不行的话,暂时无法解决,百度无数,基本上都是说编码问题,只是我自己也碰到过更改编码格式为GBK/UTF-8依然解决不了问题的情况.

JSP中文乱码问题解决方案

1.项目工程编码统一采用UTF-8编码 2.JSP页面采用UTF-8编码 <%@ page language="java" import="java.util.*,entity.Student" pageEncoding="UTF-8"%> 3.设置request内置对象采用utf-8编码,防止表单提交产生信息乱码(POST方式提交) request.setCharacterEncoding("utf-8"); 4

java中文乱码解决方法汇总

publicstaticvoidmain(String[]argv){ try{ System.out.println("中文");//1 System.out.println("中文".getBytes());//2 System.out.println("中文".getBytes("GB2312″));//3 System.out.println("中文".getBytes("ISO8859_1″));

在jQuery中Ajax的Post提交中文乱码的解决方案(转)

引言: 在jQuery的Ajax POST请求中,进行请求,其中的中文在后台,显示为乱码,该如何解决呢? 问题的引入: var regid = $('#oregion').combobox('getValue'); //var sname = $('#sname').val(); var sname = encodeURI($('#sname').val(),"UTF-8"); if(regid!=""&&regid!='undefined'){ $

中文乱码问题解决方案

UTF-8编码与GBK,GB2312编码区别 UTF-8:Unicode TransformationFormat-8bit,允许含BOM,但通常不含BOM.是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码.UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强.UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示.如,如果是UTF8编码,则在外国人的英文IE上也能显示中文,他们无需下载IE的中文语言支持包. GBK是国家

最近在调用 calendar.js 的时候出现中文乱码! 解决方案

最近写一个小项目的时候:在调用 calendar.js  的时候出现中文乱码! 如图所示: 原因在于: 我的jsp 页面,指定的是 UTF-8 编码,然而,调用的 calendar.js 的编码确实 GBK 编码,所以出现上面的结果. 解决方案: 再引入 JS文件的时候,指定 编码格式: 例如: <script type="text/javascript" src="<%=path %>/admin/images/calendar.js"  cha