二进制字节数组转json中文乱码问题

564 阅读1分钟

一般项目中,我们使用以下代码将 二进制字节数组 -> json

function decodeToJson(payload) { 
    // 这里的payload是二进制字节数组
    const str = String.fromCharCode.apply(String, payload)
    return JSON.parse(str)
}

但是使用 String.fromCodePoint.apply() 方法时,需要注意,String.fromCodePoint() 方法只能处理 Unicode 码点,而中文字符的 Unicode 码点通常是大于 0xFFFF 的,需要使用两个码点来表示。使用 apply() 方法时,传递的参数会被转换为一个数组,如果传递的参数中包含中文字符,中文字符的两个码点分开放入了数组中,就会出现中文乱码情况

解决方案

方案1

首先处理二进制数组,将中文的两个码点合并,作为一个数组的一个元素,再使用String.fromCodePoint() 方法即可。

以下是示例代码:

function convertBytes(bytes) { 
    var raw_payload = new Uint8Array(bytes); 
    var binary_string = new TextDecoder().decode(raw_payload); // 转成json字符串,然后按照字符拆解 
    var payload = []; 
    for (var i = 0; i < binary_string.length; i++) { 
        var c = binary_string.charCodeAt(i); 
        payload.push(c) 
    } 
    return payload; 
}

方案2

若二进制字节数组中没有将中文的两个码点作为一个元素,解析的时候,可以参考以下方案

function decodeToStr(payload) { 
    const str = new TextDecoder('utf-8').decode(ew Uint8Array(payload)); 
    return str; 
}