JAVA关于http,以及tomcat的编码问题

引言:以前一直没搞明白,知道真正遇到问题才发现,真恶心啊。介绍下背景,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="你想要的编码":如下图

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要顺腾摸瓜,个人经验。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值