本文概述
在使用node.js或其他JavaScript平台(多操作性)时, 你会发现某些方法决定返回不同于字符串的内容。 Uint8Array是一个类型化的数组, 表示8位无符号整数的数组。
以下方法列表提供了将Uint8Array转换为javascript中常规字符串的有效方法的集合。
小串
对于小的数组(> = 100k个字符), 可以使用以下方法, 否则会出现RangeError异常:超出最大调用堆栈大小或堆栈空间不足。但是, 你需要知道此方法不适用于UTF-8字符。
function uint8arrayToStringMethod(myUint8Arr){
return String.fromCharCode.apply(null, myUint8Arr);
}
浏览器实施
如果你的JavaScript在浏览器中执行, 则可以使用TextEncoder和TextDecoder本机函数, 这些函数允许你选择要使用的编码。编码API有助于解决字符串转换问题。
/**
* Convert an Uint8Array into a string.
*
* @returns {String}
*/
function Decodeuint8arr(uint8array){
return new TextDecoder("utf-8").decode(uint8array);
}
/**
* Convert a string into a Uint8Array.
*
* @returns {Uint8Array}
*/
function Encodeuint8arr(myString){
return new TextEncoder("utf-8").encode(myString);
}
跨平台方法
以下方法非常有用, 效果很好。它不使用任何技巧, 也不依赖于Browser JS函数, 例如在其他JS环境中也可以使用。通过UTF-8约定工作。
// http://www.onicos.com/staff/iz/amuse/javascript/expert/utf.txt
/* utf.js - UTF-8 <=> UTF-16 convertion
*
* Copyright (C) 1999 Masanao Izumo <iz@onicos.co.jp>
* Version: 1.0
* LastModified: Dec 25 1999
* This library is free. You can redistribute it and/or modify it.
*/
function Utf8ArrayToStr(array) {
var out, i, len, c;
var char2, char3;
out = "";
len = array.length;
i = 0;
while(i < len) {
c = array[i++];
switch(c >> 4)
{
case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
// 0xxxxxxx
out += String.fromCharCode(c);
break;
case 12: case 13:
// 110x xxxx 10xx xxxx
char2 = array[i++];
out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
break;
case 14:
// 1110 xxxx 10xx xxxx 10xx xxxx
char2 = array[i++];
char3 = array[i++];
out += String.fromCharCode(((c & 0x0F) << 12) |
((char2 & 0x3F) << 6) |
((char3 & 0x3F) << 0));
break;
}
}
return out;
}
大块
如果你的数据块很大, 则可能需要使用一种对大数据正确工作的方法(异步方法)。在这种情况下, 我们将创建包含Uint8Array的blob, 然后使用文件读取器将其读取为文本。
/**
* Converts an array buffer to a string
*
* @param {Uin8} uint8arr | The buffer to convert
* @param {Function} callback | The function to call when conversion is complete
*/
function largeuint8ArrToString(uint8arr, callback) {
var bb = new Blob([uint8arr]);
var f = new FileReader();
f.onload = function(e) {
callback(e.target.result);
};
f.readAsText(bb);
}
// Usage example
// "Hello" in Uint8Array format
var myuint8Arr = new Uint8Array([72, 101, 108, 108, 111, 32, 33]);
largeuint8ArrToString(myuint8Arr, function(text){
// Hello
console.log(text);
});
注意:如前所述, 仅当处理大量数据集时, 才建议使用此方法。
玩得开心
评论前必须登录!
注册