最近在使用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编码,不是就进行转码,这里就不再多说了。
参考: