springBoot 中文乱码问题分析,即统一utf8编码

最近在使用sprintBoot,发现中文乱码问题,所以这里记录一下。

乱码问题,很多问题都要从数据库、应用程序、客户端三个部分进行分析。

1、数据库编码设置

配置my.cnf:

--在 [mysqld] 标签下加上三行
default-character-set = utf8
character_set_server = utf8
lower_case_table_names = 1 //表名不区分大小写(此与编码无关)


--在 [mysql] 标签下加上一行
default-character-set = utf8


--在 [mysql.server]标签下加上一行
default-character-set = utf8


--在 [mysqld_safe]标签下加上一行
default-character-set = utf8


--在 [client]标签下加上一行
default-character-set = utf8
 

2、SpringBoot链接数据库编码设置

在application.properties里配置链接编码,如下:

####### db config
spring.datasource.driverClassName = com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test_db?useUnicode=true&characterEncoding=UTF8&useSSL=true&allowMultiQueries=true&serverTimezone=Asia/Seoul
spring.datasource.username=test_db
spring.datasource.password=test_db.123456
 

3、SpringBoot返回内容编码设置

SpringMVC的@ResponseBody返回中文乱码的原因是SpringMVC默认处理的字符集是ISO-8859-1,在Spring的org.springframework.http.converter.StringHttpMessageConverter类中可以看到如下代码:

public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");

但是实际需要的是UTF-8,所以需要转换, 添加produces = "application/json; charset=utf-8" / produces="text/html;charset=UTF-8",如下所示:

@RequestMapping(value = "/select", produces = "application/json; charset=utf-8")
@ResponseBody  
public String getSelectTagByCategory(@RequestParam Map<String,String> data) 
{
        StringBuffer sb = new StringBuffer();
        return sb.toString();
}

第二种:在配置文件中的mvc:annotation-driven中添加如下代码:
<mvc:annotation-driven >
        <!-- 消息转换器 -->
        <mvc:message-converters register-defaults="true">
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes" value="text/html;charset=UTF-8"/>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
    <mvc:resources location="/resources/" mapping="/resources/**" />

对于乱码问题,这样就可以正常显示中文了.

4、MockMvcRequestBuilders 测试编码设置

String response = mockMvc.perform(MockMvcRequestBuilders.get(url).accept(MediaType.APPLICATION_JSON_UTF8)
        .contentType(MediaType.APPLICATION_JSON))
        .andExpect(MockMvcResultMatchers.status().isOk())
        .andDo(print())
        .andReturn().getResponse().getContentAsString();

但是,MediaType.APPLICATION_JSON_UTF8已经在SpringBoot 2.1.6版本上,显示即将抛弃,但是设置了测试了一下,还是起作用的。

5、客户端编码

那就是客户端这边设置utf8编码,不是就进行转码,这里就不再多说了。

参考:

https://blog.csdn.net/zknxx/article/details/52423608

https://blog.csdn.net/zsq520520/article/details/68107413

发布了120 篇原创文章 · 获赞 125 · 访问量 107万+

猜你喜欢

转载自blog.csdn.net/yangyangye/article/details/102722866