目前测试过程中遇到 URL 编解码问题,在此简单做个小计

目前国内中文用的最多编码格式为 UTF-8 和 GBK 两种方式,GBK 两字节编码,UTF-8 为 1~6 字节编码,其中 GBK 与 UTF-8 有一定的字符集交叉,采用正则方式进行匹配校验

/**
     * 正则方式判断字符编码,默认为UTF-8
     * @param encodeValue
     * @return
     */
    public Boolean getURLEncode(String encodeValue){
        //utf8编码 字符集
        Pattern utf8Pattern = Pattern.compile("^([\\x00-\\x7f]|[\\xc0-\\xdf][\\x80-\\xbf]|[\\xe0-\\xef][\\x80-\\xbf]{2}|[\\xf0-\\xf7][\\x80-\\xbf]{3}|[\\xf8-\\xfb][\\x80-\\xbf]{4}|[\\xfc-\\xfd][\\x80-\\xbf]{5})+$");
        //通用字符集(utf-8和GBK)
        Pattern publicPattern = Pattern.compile("^([\\x01-\\x7f]|[\\xc0-\\xdf][\\x80-\\xbf])+$");
        /**
         * 通用字符集判断
         */
        Matcher publicMatcher = publicPattern.matcher(encodeValue);
        if(publicMatcher.matches()){
            return false;
        }

        Matcher matcher = utf8Pattern.matcher(encodeValue);
        if(matcher.matches()){
            return true; 
        }else {
            return false;
        }
    }
/**
     * 解码
     * @param urlInfo
     * @param encodeStr
     * @return
     */
    public String getUrlDecode(String urlInfo,String encodeStr){
        String result = "";
        if(null == urlInfo){
            return result;
        }       
        try{
            result = URLDecoder.decode(urlInfo, encodeStr);
        }catch(UnsupportedEncodingException e){
            e.printStackTrace();
        }
        return result;
    }
@Test
    public void testAutoURLDecode(){
        //UTF-8编码
        String str0 = "cntaobao%C3%FB%D1%EFy";
        //GBK编码
        String str1 = "cntaobao%e5%90%8d%e6%89%acy";
        String encodeStr0 = "UTF-8";
        String encodeStr1 = "GBK";

        if(getURLEncode(str0).equals(true)){
            System.out.println(getUrlDecode(str0, encodeStr0));
        }else {
            System.out.println(getUrlDecode(str0, encodeStr1));
        }

    }

结果输出:
cntaobao 名扬 y


↙↙↙阅读原文可查看相关链接,并与作者交流