JSON序列化传输过程中中文乱码问题的解决方法
今天在用WebSocket
和Servlet
写聊天室的时候发现传输中文会乱码的问题,起初以为是在用jackson
的 $ObjectMapper$ 将对象转化为字节流的时候出现的问题,但是经过检查后发现不是。又检查了一遍编码,确认了网页的编码是utf-8
,输入的字符串也是utf-8
,然后发现问题是出在了JSON
对象传输的过程中。最后在 stackoverflow 上找到了解法。
我的问题出在将经过JSON
序列化之后的消息对象字符串转换为 $Uint8Array$ 以及将 $Uint8Array$ 转为消息对象的过程中,对此可以采用 $TextEncoder$ 和 $TextDecoder$ 对象。如下所示:
let encoder = new TextEncoder('utf-8');
let decoder = new TextDecoder('utf-8');
let message = {
username: '用户',
content: '你好,世界!'
};
let array = encoder.encode(JSON.stringify(message));
let newMessage = JSON.parse(decoder.decode(array));
在上例中,我们分别使用 $TextEncoder$ 和 $TextDecoder$ 以utf-8
作为编码方式创建了编码器和译码器,之后声明了一个 $message$ 对象存储我们要传递的消息,使用JSON
序列化该对象,并使用编码器进行编码,编码后得到的是可以进行传输的 $Uint8Array$ 对象,而对其使用译码器进行译码可以得到另一个 $newMessage$ 对象,该对象内存储的值与之前的 $message$ 相同,并且没有出现中文乱码的现象。