前言
过来,老铁!
笔者正在学习Spring Boot一段时间。 请附上Spring Boot系列的学习文章,阅读。 期待您的指导。
这是最近使用spring boot APP的一大技巧之一,还不能写文章。 今天我来介绍一下知识点。
如何解决Spring Boot中文乱码问题?
整体步骤
创建返回包含中文内容的API;
中文乱码演示;
解决中文乱码:(方法1 );
解决中文乱码:(方法2;
解决中文乱码:(方法3 ) -全球解决中文乱码问题;
中文常规显示演示;
汉语乱码原因分析;
1 .创建回复内容中包含中文的API
要将API添加到Spring Boot项目的控制器中,请执行以下操作:
@getmapping(/API/hello ) ) )。
公共JSON对象say hello () {
JSON对象test=new JSON object (;
test.put('name ',' dylanz ' );
test.put('say ','你好);
返回测试;
}
2 .中文乱码演示:
中文乱码演示
API回来后,英语会正常显示,但中文是乱码的。 不要分析原因,先看看怎么解决吧!
3 .解决中文乱码:
怎么解决,非常简单。 请修改API :
@getmapping(/API/hello ) ) )。
公共JSON对象say hello () {
httpservletresponseresponse=(servletrequestattributes ) objects.requirenonnull ) requestcontextholder.getrequestatribuestatribute
资产响应!=null;
response.setcharacterencoding (utf-8 );
JSON对象test=new JSON object (;
test.put('name ',' dylanz ' );
test.put('say ','你好);
返回测试;
}
原理非常简单,通过在正在回复的头信息中指定字符集为UTF-8,父测试非常有效!
纠正中文乱码
指定字符集为UTF-8
4 .解决中文乱码:(方法2 );
这个方法更简单,比第一个更简单。 只需在API中指定产品即可。 例如,以下情况:
@getmapping(value='/API/hello ',产品=' application/JSON; charset=UTF-8 ' )
公共JSON对象say hello () {
JSON对象test=new JSON object (;
test.put('name ',' dylanz ' );
test.put('say ','你好);
返回测试;
}
这种方式也能解决中文乱码问题,测试很有效!
5 .解决中文乱码:(方法3 ) -全球解决中文乱码问题;
解决上述中文乱码的两种方法很简单,但需要添加一个个的API。 这不符合我们的气质啊。 正确的态度是全球解决中文乱码问题。
在config包中创建新的CharsetConfig.java类,并将代码写入该配置类中。 不问类名。 不需要CharsetConfig。
package com.github.dylanz 666.config;
import com.Alibaba.fast JSON.serializer.serializer feature;
import com.Alibaba.fast JSON.support.config.fastjsonconfig;
import com.Alibaba.fast JSON.support.spring.fastjsonhttpmessageconverter;
importorg.spring帧work.context.annotation.bean;
importorg.spring framework.context.annotation.configuration;
importorg.spring framework.http.med
iaType;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.WebMvcConfigurationSupport;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
/**
* @author : dylanz
* @since : 11/15/2020
*/
@Configuration
public class CharsetConfig extends WebMvcConfigurationSupport {
@Bean
public HttpMessageConverter responseBodyConverter() {
return new StringHttpMessageConverter(
StandardCharsets.UTF_8);
}
@Override
public void configureMessageConverters(
List> converters) {
super.configureMessageConverters(converters);
converters.add(responseBodyConverter());
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(
SerializerFeature.PrettyFormat
);
List fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
fastConverter.setSupportedMediaTypes(fastMediaTypes);
fastConverter.setFastJsonConfig(fastJsonConfig);
converters.add(fastConverter);
}
@Override
public void configureContentNegotiation(
ContentNegotiationConfigurer configurer) {
configurer.favorPathExtension(false);
}
}
由于我使用的是fastjson,因此在configureMessageConverters中添加了fastjson对中文支持的配置代码。
编写完成后,删除(方法一)和(方法二)的支持代码后,重启项目,中文支持已经变成全局生效啦,亲测有效!
6. 中文正常显示演示;
中文正常显示演示
7. 中文乱码原因分析;
1). 借用第三步解决乱码问题的代码,稍微做一下修改,打印出修改前的字符集:
@GetMapping("/api/hello")
public JSONObject sayHello() {
HttpServletResponse response = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getResponse();
assert response != null;
System.out.println("Default charset: " + response.getCharacterEncoding());
JSONObject test = new JSONObject();
test.put("name", "dylanz");
test.put("say", "您好");
return test;
}
2). 再次启动项目并访问API后:
中文乱码原因
原因找到了,原来Spring Boot中的JSON默认字符集是:ISO-8859-1(如果返回是纯String,则字符集为UTF-8,且中文不会乱码)。
从浏览器或postman上也能看出默认的字符集设置:
默认字符集
3). 我们解决乱码后的字符集:
image.png
至此,我们从2个维度、3种方法,解决了Spring Boot项目中中文乱码的问题:
API单独设置字符集;
全局设置字符集;
要我说,肯定是全局设置字符集更香啊,您说呢?
如果本文对您有帮助,麻烦点赞、关注!
谢谢!