从服务端获取json串中文unicode编码问题
今天遇到从服务端获取json数据打印到控制台后发现json中包含的中文全部是unicode编码显示状态,经过查阅解决问题如下。
服务端返回的json中输出到控制台的内容有一段是这样的:
1 | "text": "\u6709\u53ea\u82cd\u8747\u98de\u8fdb" |
用getBytes() (不可用)
直接截取内容用getBytes()转能转成中文,但是整个json内容转的时候确实无效的。
1 | String str = "\u6709\u53ea\u82cd\u8747\u98de\u8fdb"; |
输出如下:
1 | 有只苍蝇飞进着 |
用 regex 的 pattern 和 matcher (可用)
用正则把unicode编码转成16进制,再用char显示就成中文了。
char类型是一个单一的 16 位 Unicode 字符,最小值是 \u0000
(即为0),最大值是 \uffff
(即为65535),可以储存任何字符。
这里的data是直接服务端获取的json串。
1 | Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))"); |
从代码上看,Unicode转中文关键是:
(char)Integer.parseInt(matcher.group(2), 16),其中matcher.group(2)表示匹配到的Unicode编码格式。比如:4e2d转成16进制为200013,即:(char)200013为汉字:中。
java底层如何表示字符型数据?
java中的String类型是采用UTF-16编码实现的,也就是不管在源码的编码如何,在Java虚拟机中的字符串都是使用UTF-16编码实现。
我们要知道String其实就是char[]。也就是说,java底层保存字符型数据是使用16位整数数字。
这意味着我们可以这样:(char)200013结果:中 。
用 fastjson 包 (可用)
还有更简单的方法,fastjson 包是阿里的一个解析json的jar 包。
这里的data是直接服务端获取的json串。
1 | JSONObject jsonObject = JSON.parseObject(data); |
这是fastjson的github wiki:
https://github.com/alibaba/fastjson/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
学习文献
【1】http://blog.csdn.net/u013066244/article/details/54708179
【2】https://segmentfault.com/q/1010000005710620?_ea=943588
完结。