function ab2str(buf) {
return String.fromCharCode.apply(null, new Uint16Array(buf));
}
function str2ab(str) {
var buf = new ArrayBuffer(str.length*2); // 2 bytes for each char
var bufView = new Uint16Array(buf);
for (var i=0, strLen=str.length; i<strLen; i++) {
bufView[i] = str.charCodeAt(i);
}
return buf;
}
我想澄清一下UTF8和UTF16编码之间的区别,因为我不确定这个说法是否正确。
在JavaScript中,据我了解,所有的字符串都是UTF16编码的。但你自己的ArrayBuffer中可能包含任何编码的原始字节。
假设我已经提供了一个ArrayBuffer给浏览器,而这些来自后端的字节是以UTF8编码的:
var r = new XMLHttpRequest()
r.open('GET', '/x', true)
r.responseType = 'arraybuffer'
r.onload = function(){
var b = r.response
if (!b) return
var v = new Uint8Array(b)
}
r.send(null)
现在我们从响应
r
中获得了ArrayBuffer b
,并将其放入了Uint8Array视图v
中。问题是,如果我想将它转换为JavaScript字符串,该怎么做。
据我所知,
v
中的原始字节以UTF8编码(并且已经以UTF8编码发送到浏览器)。但如果我们这样做,我认为它不会正常工作:function ab2str(buf) {
return String.fromCharCode.apply(null, new Uint16Array(buf));
}
根据我的理解,我们使用的是UTF8编码,而JavaScript字符串使用的是UTF16编码,因此您需要这样做:
function ab2str(buf) {
return String.fromCharCode.apply(null, new Uint8Array(buf));
}
第一个问题是使用Uint8Array而不是Uint16Array。那么,如何将utf8字节转换为js字符串。
第二个问题是如何从JavaScript字符串返回UTF8字节。也就是说,我不确定这样编码是否正确:
function str2ab(str) {
var buf = new ArrayBuffer(str.length*2); // 2 bytes for each char
var bufView = new Uint16Array(buf);
for (var i=0, strLen=str.length; i<strLen; i++) {
bufView[i] = str.charCodeAt(i);
}
return buf;
}
我不确定在这种情况下应该做出什么改变,以便返回一个UTF8的ArrayBuffer。类似这样的东西似乎是不正确的:
function str2ab(str) {
var buf = new ArrayBuffer(str.length*2); // 2 bytes for each char
var bufView = new Uint8Array(buf);
for (var i=0, strLen=str.length; i<strLen; i++) {
bufView[i] = str.charCodeAt(i);
}
return buf;
}
无论如何,我只是试图澄清如何从后端编码字符串的UTF8字节转换为前端的UTF16 JavaScript字符串。
String.fromCharCode.apply(null, new Uint8Array(buf))
" - 不行,那只适用于ASCII字符串。你需要一个正确的TextDecoder
(以及一个TextEncoder
进行反转)。 - Bergi