十六進位制Unicode編碼字串與中文字串的相互轉換
阿新 • • 發佈:2019-02-04
圖書館客戶端專案中遇到的一個問題,得到的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; } }