解決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;
		}

	}