十六进制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;
		}

	}


 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值