解決URLパスには中国語と特殊記号が含まれています
2218 ワード
ブラウザでは、中国語や特殊な記号を直接伝えることはできません.一般的にunicode符号化に移行します.特殊な記号の場合、符号化のフォーマットは、%プラス文字のASCII符号、すなわちパーセント記号%で、対応する文字のASCII(16進)符号値に続きます.たとえば、スペースのエンコード値は「%20」です.
/**
* url utf-8 2015 12 29 4:35:33
*
* @param urlpath
* @return
*/
public static String ecodeUrlWithUTf8(String urlpath) {
String decodedurl = "";
try {
URL url = new URL(urlpath);
decodedurl = "http://" + url.getHost() + ":" + url.getPort();
String path = url.getPath();
String[] paths = path.split("\\/");
String decodepath = "";
for (int i = 0; i < paths.length; i++) {
if (paths[i] != null && paths[i].length() > 0) {// uft-8
char[] chars = paths[i].toCharArray();
String str = "";
for (char c : chars) {
String s = String.valueOf(c);
byte[] bs = s.getBytes("utf-8");
if (bs.length == 3) {
str = str + URLEncoder.encode(s, "utf-8");
} else if (bs.length == 1) {
String ss = getSpecialChartAscll(bs[0]);
if (ss != null) {
s = ss;
}
str = str + s;
} else {
str = str + s;
}
}
decodepath = decodepath + "/" + str;
}
}
decodedurl = decodedurl + decodepath;
} catch (Exception e) {
return null;
}
return decodedurl;
}
private static String getSpecialChartAscll(byte b) {
if (b >= 32 && b <= 41) {
return "%" + (b - 12);
} else {
String s = "" + b;
switch (b) {
case 42:
s = "%2A";
break;
case 43:
s = "%2B";
break;
case 44:
s = "%2C";
break;
case 45:
s = "%2D";
break;
case 46:
s = "%2E";
break;
case 47:
s = "%2F";
break;
case 58:
s = "%3A";
break;
case 59:
s = "%3B";
break;
case 60:
s = "%3CF";
break;
case 61:
s = "%3D";
break;
case 62:
s = "%3E";
break;
case 63:
s = "%3F";
break;
case 64:
s = "%40";
break;
default:
return null;
}
return s;
}
}