如何将UTF8 ArrayBuffer转换为UTF16 JavaScript字符串

时间:2018-07-24 21:12:41

标签: javascript encoding utf-8 arraybuffer

从这里得到的答案让我开始学习如何使用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字符串的精确度。

0 个答案:

没有答案