一般项目中,我们使用以下代码将 二进制字节数组 -> 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;
}