十六进制Unicode编码字符串与中文字符串的相互转换

时间:2023-01-11 12:14:35

图书馆客户端项目中遇到的一个问题,得到的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;}}