zoukankan      html  css  js  c++  java
  • 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)
        }
    }

    完美解决了乱码问题

  • 相关阅读:
    利用 ImageAI 在 COCO 上学习目标检测
    pip 安装包提速
    opencv 学习资料
    Win10 小技巧
    tqdm:Python 进度条
    自制 COCO api 直接读取类 COCO 的标注数据的压缩文件
    线性回归模型的 MXNet 与 TensorFlow 实现
    cv2 与 matplotlib 的 Bug 记录
    pyinstaller 打包错误集锦
    python函数的进阶
  • 原文地址:https://www.cnblogs.com/exmyth/p/15529041.html
Copyright © 2011-2022 走看看