回到顶部 暗色模式

JSON序列化传输过程中中文乱码问题的解决方法

        今天在用WebSocketServlet写聊天室的时候发现传输中文会乱码的问题,起初以为是在用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$ 相同,并且没有出现中文乱码的现象。