从这里得到的答案让我开始学习如何使用ArrayBuffer:
Converting between strings and ArrayBuffers
但是,他们有很多不同的方法。主要的是这样:
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编码之间的区别,因为我不是100%地确定这是正确的。
据我所知,在JavaScript中,所有字符串都是UTF16编码的。但是您可能在自己的ArrayBuffer中拥有的原始字节可以采用任何编码。
所以说我有一个provided从XMLHttpRequest到浏览器的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)
因此,现在在Uint8Array视图b
中,响应r
有了ArrayBuffer 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 bytes -> js string
开始。
第二个问题是现在如何从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字符串的精确度。