图书馆客户端项目中遇到的一个问题,得到的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"
{}括号中到底是什么内容,最后发现是汉字的十六进制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;}}