目前测试过程中遇到 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