1. 检查tomcat 配置, 查看编码设置,见粗体
找到 server.xml 中的一下代码,查看一下粗体的设置
<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding='UTF-8' />
2. 查看字符集过滤器
基于web.xml 的配置
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
基于javaconfig 配置
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceEncoding(true);
return new Filter[]{characterEncodingFilter};
}
encoding 设置request编码, forceEncoding 设置request和response 编码一致
3. 查看springMVC 的消息转换器配置
基于配置文件的
<bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8" index="0"/>
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
</list>
</property>
</bean>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="stringHttpMessageConverter"/>
<ref bean="jackson2HttpMessageConverter"/>
</list>
</property>
</bean>
<mvc:annotation-driven />
配置文件第二种方式
<mvc:annotation-driven>
<mvc:message-converters>
<ref bean="stringHttpMessageConverter"/>
<ref bean="jackson2HttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
基于javaconfig
@Override
protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(stringHttpMessageConverter());
converters.add(mappingJackson2HttpMessageConverter());
super.configureMessageConverters(converters);
}
@Bean(name = "stringHttpMessageConverter")
public StringHttpMessageConverter stringHttpMessageConverter() {
StringHttpMessageConverter converter = new StringHttpMessageConverter();
converter.setSupportedMediaTypes(Arrays.asList(new MediaType("text", "plain", Charset.forName("UTF-8"))));
return converter;
}
@Bean(name = "mappingJackson2HttpMessageConverter")
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
messageConverter.setSupportedMediaTypes(Arrays.asList(MediaType.APPLICATION_JSON_UTF8));
return messageConverter;
}
4. 检查 java 文件编码, java文件编码影响
系统变量file.encoding影响到
a. Charset.defaultCharset() Java环境中最关键的编码设置
b. URLEncoder.encode(String) Web环境中最常遇到的编码使用
c. com.sun.org.apache.xml.internal.serializer.Encoding 影响对无编码设置的xml文件的读取
d. javax.print.DocFlavor 影响打印的编码
5. gradle build 打包时出现编码的不可映射字符的问题
build.gradle 添加如下代码, 见粗体
repositories {
mavenCentral()
}
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
dependencies {
compile("org.springframework:spring-context:4.3.6.RELEASE")
}