判断URL中的中文参数是GB2312还是Utf-8编码

以下文章转自:https://www.cnblogs.com/sandyfog/p/4736517.html

【如出现侵权问题,请第一时间联系我删除该文章】


如两个URL字符串:

&q=%E8%A3%99%E5%AD%90&style=grid&seller_type=taobao
&q=%CE%D0%C2%D6%D4%F6%D1%B9&style=list&s=44;

上面有uft-8编码,下面的用gb2312编码,但是怎么自动识别呢?

参考csdn论坛讨论,解决方法有两种:

不管它是utf-8,还是 gbk, 还是....
先按 iso-8859-1 解码
然后用正则 匹配一下看是否全文符合 utf-8 规则
符合的话,认为是 utf-8, 不符合认为是 gbk

public  String urlDecode(String code) throws Exception{
        
        String tem = URLDecoder.decode(code, "iso-8859-1");
        if (tem.matches("^(?:[\\x00-\\x7f]|[\\xe0-\\xef][\\x80-\\xbf]{2})+$"))
            return URLDecoder.decode(code, "utf-8");
        else
            return URLDecoder.decode(code,"gb2312");
    }

通用的判断方法:
假定他就是 GBK 的编码:
则将其解码成字节码,然后再把字节码编码为GBK,如果转换回来后与没有转换之前是相等的。这样假设成立,也就是GBK编码。
可以描述成这样:
字符串 abc 如果是GBK编码的话,经过转换
abc -> GBK -> byte -> GBK -> abc2
如果: abc == abc2 说明假设成立,他就是GBK编码,否则不相等。
代码如下:

    public  String decode(String code) throws Exception {

        String fis = URLDecoder.decode(code, "gb2312");
        String sec = new String(fis.getBytes("gb2312"), "gb2312");
        if (fis.equals(sec))
            return fis;
        else {
            return URLDecoder.decode(code, "utf-8");
        }
    }

另外检测字节流是否是UTF8编码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值