引言:以前一直没搞明白,知道真正遇到问题才发现,真恶心啊。介绍下背景,tomcat使用GBK编码,项目也使用GBK编码,项目是ssm框架。我拥有一个Controller方法,外部通过http调用,自己测试时用的是ajax。
叙述:我用ajax,get方式,json,编码用utf-8传,ok,后台打印正确。将ajax编码改为GBK,中文错误(因为对接口定义就是传入数据未GBK,毕竟我又改不了头的想法),我又尝试在浏览器get方式调用,中文乱码。我又尝试jsp里面用表单post传,仍旧错误。
我的解决:我以为别人调用是get,结果人家是post,我以为项目有编码拦截器,结果注释了。
然后通过下面那种方法才发现,当ajax用utf-8传的时候,通过解码,会正确,但是ajax设置了GBK,传到后台仍旧是utf-8,但是是乱码,感觉就像强行转为GBK,但是还是使用utf-8传,可能跟xmlRequest这个东西有关吧(具体也不是很了解)。
当用浏览器get传,因为浏览器是utf-8,使用uri的encode转来转去,就乱了。当别人用post调用的时候(PB程序调的,可老了),GBK传,但是用iso-8859-1解(毕竟我没写拦截)。所以呀,还是要静下心来,顺藤摸瓜。有空的时候,多了解了解底层也是挺好的
了解下各种编码:
iso-8859-1:算是最早的编码了吧。单字节编码(我不太懂这些底层,哈哈), 很明显,iso8859-1编码表示的字符范围很窄,无法表示中文字符。但是,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用iso8859-1编码来表示。而且在很多协议上,默认使用该编码.
GBK/gb2312:
汉字的国标码,专门用来表示汉字,是双字节编码,而英文字母和iso8859-1一致(兼容iso8859-1编码)。
其中gbk编码能够用来同时表示繁体字和简体字,
而gb2312只能表示简体字,gbk是兼容gb2312编码的
Unicode:
这是最统一的编码,可以用来表示所有语言的字符,定长编码便于计算机处理(注意GB2312/GBK不是定长编码),而unicode又可以用来表示所有字符,所以在很多软件内部是使用unicode编码来处理的,比如java。
UTF:
算了复制太麻烦,推荐这个博客:https://www.cnblogs.com/haimishasha/p/6117968.html
我就是看了这篇恍然大悟的,本来想总结一下,发现还不如人家写的。。。
网上搜索修改编码办法如下:
1.直接修改tomcat的server.xml文件,在里面增加URIEncoding="你想要的编码":如下图![](https://img-blog.csdn.net/20180522150613314?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BlcnNvbmNoZW42NjY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
URIEncoding="GBK",就是设置默认编码GBK,useBodyEncoding...="true"的作用就是说,请求时指定编码的则按照指定编码来。值得注意的是,他们都有个URI,意思就是url请求数据。
大概就是这个只能对url请求作用有效,而且修改整个tomcat,虽然一劳永逸,但还是根据实际情况来咯!
2.对项目的web.xml里面配置拦截器:
比如spring就只带一个
3.还有什么两次encode,
new String(charset)
setCharacterEncoding()
分享一个获得编码格式的方法
//检验编码格式
public static String getEncoding(String str) {
String encode = "GB2312";
try {
if (str.equals(new String(str.getBytes(encode), encode))) { // 判断是不是GB2312
String s = encode;
return s; // 是的话,返回GB2312,以下代码同理
}
} catch (Exception e) {
CommonLog.error("getEncoding异常---GB2312"+ e.getMessage());
}
encode = "ISO-8859-1";
try {
if (str.equals(new String(str.getBytes(encode), encode))) { // 判断是不是ISO-8859-1
String s1 = encode;
return s1;
}
} catch (Exception e) {
CommonLog.error("getEncoding异常---ISO-8859-1"+ e.getMessage());
}
encode = "UTF-8";
try {
if (str.equals(new String(str.getBytes(encode), encode))) { // 判断是不是UTF-8编码
String s2 = encode;
return s2;
}
} catch (Exception e) {
CommonLog.error("getEncoding异常---UTF-8"+ e.getMessage());
}
encode = "GBK";
try {
if (str.equals(new String(str.getBytes(encode), encode))) { // 判断是不是GBK
String s3 = encode;
return s3;
}
} catch (Exception e) {
CommonLog.error("getEncoding异常---GBK"+ e.getMessage());
}
return ""; // 到这一步,你就应该检查是不是其他编码啦
}
找bug要顺腾摸瓜,个人经验。