微信小程序 JS 字符串string与utf8编码的arraybuffer的相互转换
微信小程序 JS 字符串string与utf8编码的arraybuffer的相互转换
 最近在做一个微信小程序,和后端用websocket连接,后端要求传输过去的信息是UTF8编码的二进制信息。JS并没有可以直接进行转换的库函数,因此必须自己写一个编码以及解析的函数。
最开始采用了一个字符一个字符的charCodeAt,但是通过这种方式可以传输非中文的内容,有中文时则无法正确的转换。
后来参考了网上的一些资料,通过先将字符串编码并转换为byte[],再转换为对应的arraybuffer(解析同理,先将arraybuffer转换为byte[],再进行解码)
编码及解码的过程较复杂,不过这两个函数是可以直接使用的,同时支持中文和英文。
function stringToArrayBuffer(str) {var bytes = new Array(); var len,c;len = str.length;for(var i = 0; i < len; i++){c = str.charCodeAt(i);if(c >= 0x010000 && c <= 0x10FFFF){bytes.push(((c >> 18) & 0x07) | 0xF0);bytes.push(((c >> 12) & 0x3F) | 0x80);bytes.push(((c >> 6) & 0x3F) | 0x80);bytes.push((c & 0x3F) | 0x80);}else if(c >= 0x000800 && c <= 0x00FFFF){bytes.push(((c >> 12) & 0x0F) | 0xE0);bytes.push(((c >> 6) & 0x3F) | 0x80);bytes.push((c & 0x3F) | 0x80);}else if(c >= 0x000080 && c <= 0x0007FF){bytes.push(((c >> 6) & 0x1F) | 0xC0);bytes.push((c & 0x3F) | 0x80);}else{bytes.push(c & 0xFF);}}var array = new Int8Array(bytes.length);for(var i in bytes){array[i] =bytes[i];}return array.buffer;
}
function arrayBufferToString(arr){if(typeof arr === 'string') { return arr; } var dataview=new DataView(arr.data);var ints=new Uint8Array(arr.data.byteLength);for(var i=0;i<ints.length;i++){ints[i]=dataview.getUint8(i);}arr=ints;var str = '', _arr = arr; for(var i = 0; i < _arr.length; i++) { var one = _arr[i].toString(2), v = one.match(/^1+?(?=0)/); if(v && one.length == 8) { var bytesLength = v[0].length; var store = _arr[i].toString(2).slice(7 - bytesLength); for(var st = 1; st < bytesLength; st++) { store += _arr[st + i].toString(2).slice(2); } str += String.fromCharCode(parseInt(store, 2)); i += bytesLength - 1; } else { str += String.fromCharCode(_arr[i]); } } return str;
}
参考文章
微信小程序 JS 字符串string与utf8编码的arraybuffer的相互转换
微信小程序 JS 字符串string与utf8编码的arraybuffer的相互转换
 最近在做一个微信小程序,和后端用websocket连接,后端要求传输过去的信息是UTF8编码的二进制信息。JS并没有可以直接进行转换的库函数,因此必须自己写一个编码以及解析的函数。
最开始采用了一个字符一个字符的charCodeAt,但是通过这种方式可以传输非中文的内容,有中文时则无法正确的转换。
后来参考了网上的一些资料,通过先将字符串编码并转换为byte[],再转换为对应的arraybuffer(解析同理,先将arraybuffer转换为byte[],再进行解码)
编码及解码的过程较复杂,不过这两个函数是可以直接使用的,同时支持中文和英文。
function stringToArrayBuffer(str) {var bytes = new Array(); var len,c;len = str.length;for(var i = 0; i < len; i++){c = str.charCodeAt(i);if(c >= 0x010000 && c <= 0x10FFFF){bytes.push(((c >> 18) & 0x07) | 0xF0);bytes.push(((c >> 12) & 0x3F) | 0x80);bytes.push(((c >> 6) & 0x3F) | 0x80);bytes.push((c & 0x3F) | 0x80);}else if(c >= 0x000800 && c <= 0x00FFFF){bytes.push(((c >> 12) & 0x0F) | 0xE0);bytes.push(((c >> 6) & 0x3F) | 0x80);bytes.push((c & 0x3F) | 0x80);}else if(c >= 0x000080 && c <= 0x0007FF){bytes.push(((c >> 6) & 0x1F) | 0xC0);bytes.push((c & 0x3F) | 0x80);}else{bytes.push(c & 0xFF);}}var array = new Int8Array(bytes.length);for(var i in bytes){array[i] =bytes[i];}return array.buffer;
}
function arrayBufferToString(arr){if(typeof arr === 'string') { return arr; } var dataview=new DataView(arr.data);var ints=new Uint8Array(arr.data.byteLength);for(var i=0;i<ints.length;i++){ints[i]=dataview.getUint8(i);}arr=ints;var str = '', _arr = arr; for(var i = 0; i < _arr.length; i++) { var one = _arr[i].toString(2), v = one.match(/^1+?(?=0)/); if(v && one.length == 8) { var bytesLength = v[0].length; var store = _arr[i].toString(2).slice(7 - bytesLength); for(var st = 1; st < bytesLength; st++) { store += _arr[st + i].toString(2).slice(2); } str += String.fromCharCode(parseInt(store, 2)); i += bytesLength - 1; } else { str += String.fromCharCode(_arr[i]); } } return str;
}
参考文章