木骰

又一个编码问题:UniCode编码转中文

事情源于百度定位的一个API。这里要吐槽一下,百度其他接口返回来的都是UTF-8 的,就这个定位却是Unicode的,真蛋疼。
定位的返回结果:
{"address":"CN|\u6d59\u6c5f|\u676d\u5dde|None|CHINANET|0|0","content":{"address":"\u6d59\u6c5f\u7701\u676d\u5dde\u5e02","address_detail":{"city":"\u676d\u5dde\u5e02","city_code":179,"district":"","province":"\u6d59\u6c5f\u7701","street":"","street_number":""},"point":{"x":"120.21937542","y":"30.25924446"}},"status":0}
其实这段json也是utf-8的编码的,但是里边\u打头中文字符的却又是Unicode的。这就尴尬了,直接用Text.Encoding转Unicode还不行,转utf-8又不能显示中文。
要转的话得把除去\u打头unicode的部分用utf-8,而unicode的部分得单独扣出来取字节流,然后再用Unicode转字符串,然后再拼回去。
因为这段json的编码实际上是UTF-8的,而其中的Unicode部分,如\u6d59,其实是unicode编码的字符串被转成了utf-8的字符串,所以得把这些抠出来,按utf-8还原成字节流,再以unicode转回字符串。这真的挺麻烦的。

网上找的unicode转字符串的方法,用了正则匹配unicode的部分。直接传真个utf-8的字符串就能转了。



 //可以包括其他字符         
public string uncode(string str)  
{  
	string outStr = "";  
	Regex reg = new Regex(@"(?i)//u([0-9a-f]{4})");  
	outStr = reg.Replace(str, delegate(Match m1)  
	{  
		return ((char)Convert.ToInt32(m1.Groups[1].Value, 16)).ToString();  
	});  
	return outStr;  
}  

Unicode编码格式:
Unicode编码的字符都以\u开头,一个中文字符占4个字节,所有\u后面都跟着4个16进制字符,所以上面的代码可以按照\u[0-9a-f]{4}的方式匹配。每次匹配到的都是一个中文字符。
Unicode编码转换成中文,只需把每个16进制的字符转换成10进制的int,然后直接强转成char字符,再拼接回字符串就可以了。

— 于 共写了1123个字
— 文内使用到的标签:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*