Javascript 从UINT8数组转换为字符串并返回

Javascript 从UINT8数组转换为字符串并返回,javascript,encoding,character-encoding,Javascript,Encoding,Character Encoding,我在从一个特定的Uint8Array转换为一个字符串并返回时遇到了一个问题。我在浏览器和Chrome中工作,Chrome本机支持TextEncoder/TextDecoder模块 如果我从一个简单的案例开始,一切似乎都很顺利: const uintArray=new textcoder().encode(‘愚蠢的脸恶魔’); //UINT8阵列(17)[115、105、108、108、121、32、102、97、99、101、32、100、101、109、111、110、115] 新的文本解码

我在从一个特定的Uint8Array转换为一个字符串并返回时遇到了一个问题。我在浏览器和Chrome中工作,Chrome本机支持TextEncoder/TextDecoder模块

如果我从一个简单的案例开始,一切似乎都很顺利:


const uintArray=new textcoder().encode(‘愚蠢的脸恶魔’);
//UINT8阵列(17)[115、105、108、108、121、32、102、97、99、101、32、100、101、109、111、110、115]
新的文本解码器()。解码(uintArray);//愚蠢的鬼脸

但是下面的案例并没有给我预期的结果。在不涉及太多细节的情况下(它与密码学相关),让我们从以下事实开始:我提供了以下Uint8Array:

Uint8Array(24)[58、226、7、102、202、238、58、234、217、17、189、208、46、34、254、4、76、249、169、101、112、102、140、208]

我想做的是将其转换为字符串,然后稍后将字符串解密回原始数组,但我得到以下结果:


const uintArray=新的uint8数组([58226710220223858234221717189208 46 34254 4 762492169101112102208]);
新的TextDecoder().decode(uint8Array);/:�F��:����."�L��epf��
新建TextEncoder().encode(':�F��:����."�L��epf��');

…这导致:
Uint8Array(48)[58,239,191,189,189,239,191,189,58,239,191,189,239,191,189,189,17,239,191,189,189,239,191,189,46,34,239,191,189,189,4,76,239,191,239,189,189,189,101,112,102,239,191,191]


数组增加了一倍。编码有点超出我的控制范围。有人能告诉我为什么数组增加了一倍(我假设它是原始数组的另一种表示形式…?)。还有,更重要的是,我有没有办法返回到原始数组(即,我得到的那一个)?

您试图将数组中的代码点转换为
utf-8
,这些代码点没有意义或是不允许的。几乎所有
=128
都需要特殊处理。其中一些是允许的,但对于多字节序列是前导字节,而像
254
这样的代码点是不允许的。如果您不想这样做的话o来回转换您需要确保创建的是有效的
utf-8
。此处的代码页布局可能很有用:非法字节序列的描述也可能有用:

作为一个具体的例子,这:

let arr = new TextDecoder().decode(new Uint8Array([194, 169]))
let res = new TextEncoder().encode(arr) // => [194, 168]
之所以有效,是因为
[194169]
对©有效,但:

let arr = new TextDecoder().decode(new Uint8Array([194, 27]))
let res = new TextEncoder().encode(arr) // => [239, 191, 189, 27]

不是因为它不是一个有效的序列。

很简单:并非所有字节值都与字符串相对应。不是ASCII或unicode。此外,加密/解密编码/解码也存在误用,它们不是一回事。如果您只想将其转换为字符串并返回并获得相应的值,则可以执行以下操作:
var str=string.fromCharCode(…uintArray)
然后
Uint8Array.from([…str].map(ch=>ch.charCodeAt())
谢谢。这很有意义。我想我可能只是使用了错误的编码。也许base64会帮我一个忙?只是为了记录在案。base64帮了我的忙。我猜我的Uint8Array中有一些无法用utf8表示的代码点。