今天遇到从服务端获取json数据打印到控制台后发现json中包含的中文全部是unicode编码显示状态,经过查阅解决问题如下。

服务端返回的json中输出到控制台的内容有一段是这样的:

1
"text": "\u6709\u53ea\u82cd\u8747\u98de\u8fdb"

用getBytes() (不可用)

直接截取内容用getBytes()转能转成中文,但是整个json内容转的时候确实无效的。

1
2
3
4
String str = "\u6709\u53ea\u82cd\u8747\u98de\u8fdb";
byte[] bt = str.getBytes("utf-8");
String ret = new String(bt, "utf-8");
System.out.println(ret);

输出如下:

1
有只苍蝇飞进着

用 regex 的 pattern 和 matcher (可用)

用正则把unicode编码转成16进制,再用char显示就成中文了。

char类型是一个单一的 16 位 Unicode 字符,最小值是 \u0000(即为0),最大值是 \uffff(即为65535),可以储存任何字符。

这里的data是直接服务端获取的json串。

1
2
3
4
5
6
7
8
Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))");
Matcher matcher = pattern.matcher(data);
char ch;
while (matcher.find()) {
ch = (char) Integer.parseInt(matcher.group(2), 16);
data = data.replace(matcher.group(1), ch + "");
}
System.out.println(data);

从代码上看,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
2
3
JSONObject jsonObject = JSON.parseObject(data);

System.out.println(jsonObject.toString());

这是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

完结。