1. 程式人生 > >十六進位制Unicode編碼字串與中文字串的相互轉換

十六進位制Unicode編碼字串與中文字串的相互轉換

圖書館客戶端專案中遇到的一個問題,得到的URL 是這樣的

 String baseurl =   "http://innopac.lib.xjtu.edu.cn/availlim/search~S1*chx?/X{u848B}{u4ECB}{u77F3}&searchscope=1&SORT=DZ/X{u848B}{u4ECB}{u77F3}&searchscope=1&SORT=DZ&extended=0&SUBKEY=%E8%92%8B%E4%BB%8B%E7%9F%B3/51%2C607%2C607%2CB/browse"
如果直接使用此URL傳送httpget請求,會報異常:非法字元。即URL中不能包含有{}

{}括號中到底是什麼內容,最後發現是漢字的十六進位制Unicode編碼,上面的{u848B}{u4ECB}{u77F3}便是漢字“蔣介石”。

這就需要將十六進位制Unicode編碼字串轉成中文字串了。具體程式碼如下:

/**
	 * 把中文字串轉換為十六進位制Unicode編碼字串
	 * 
	 * @param s
	 *            中文字串
	 * @return
	 */
	public static String stringToUnicode(String s) {
		String str = "";
		for (int i = 0; i < s.length(); i++) {
			int ch = (int) s.charAt(i);
			if (ch > 255)
				str += "\\u" + Integer.toHexString(ch);
			else
				str += "\\" + Integer.toHexString(ch);
		}
		return str;
	}

	/**
	 * 把十六進位制Unicode編碼字串轉換為中文字串, 將\u848B\u4ECB\u77F3轉化成蔣介石,注意格式
	 * 
	 * @param str
	 *            eg:\u848B\u4ECB\u77F3
	 * @return 蔣介石
	 */
	public static String unicodeToString(String str) {

		Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))");

		Matcher matcher = pattern.matcher(str);

		char ch;

		while (matcher.find()) {

			ch = (char) Integer.parseInt(matcher.group(2), 16);

			str = str.replace(matcher.group(1), ch + "");

		}

		return str;

	}


然後處理這個URL,思路也很簡單,首先將URL中的“}”替換成“”,然後將“{”替換成“\\”,然後便是將其中的\u848B\u4ECB\u77F3轉成漢字

<pre name="code" class="java">/**
	 * 替換掉URL中的{}為\,然後將其中的Unicode 轉成漢字
	 * 
	 * @param baseUrl
	 *            String baseurl =
	 *            "http://innopac.lib.xjtu.edu.cn/availlim/search~S1*chx?/X{u848B}{u4ECB}{u77F3}&searchscope=1&SORT=DZ/X{u848B}{u4ECB}{u77F3}&searchscope=1&SORT=DZ&extended=0&SUBKEY=%E8%92%8B%E4%BB%8B%E7%9F%B3/51%2C607%2C607%2CB/browse"
	 *            ;
	 * @return
	 */
	public static String replaceUni2Chinese(String baseUrl) {

		Log.d(TAG, "原始URL-->" + baseUrl);
		if (baseUrl.contains("{")) {

			Log.d(TAG, "原始URL中包含漢字");

			String removeLast = baseUrl.replace("}", "");
			// System.out.println("去除後括號-->" + removeLast);

			String replaceBefore = removeLast.replace("{", "\\");
			// System.out.println("替換前括號-->" + replaceBefore);

			String result = unicodeToString(replaceBefore);
			Log.d(TAG, "unicode轉成字串後:-->" + result);

			return result;
		} else {
			Log.d(TAG, "原始URL中沒有漢字");
			return baseUrl;
		}

	}