【问题标题】:Uint8Array to string conversion difference between Firefox and ChromiumFirefox 和 Chromium 之间 Uint8Array 到字符串转换的区别
【发布时间】:2018-07-19 12:02:27
【问题描述】:

我正在尝试将二进制数据转换为这样的字符串:

var string = new TextDecoder("utf-8").decode(Uint8Array.from([1, 2, 3]));

当我在 Firefox 中查找 string 返回的变量时,它显示了预期的字符串 "\u0001\u0002\u0003"

虽然当我在 Chrome 中执行相同操作时,string 返回一个空字符串 ""

有人可以解释一下,这是怎么回事吗?

【问题讨论】:

  • Chrome 尝试在控制台中“显示”输出字符串中的值。在 chrome 中尝试JSON.stringify(new TextDecoder("utf-8").decode(Uint8Array.from([1, 2, 3])))
  • 在 Chrome 67 上,我得到一个由 3 个不可打印字符组成的字符串,呈现为空方块。该字符串由正确的 unocode 代码点组成,如 Array.from({length: string.length}, (v, k) => k).map ( idx => string.codePointAt(idx) ); 所示

标签: javascript google-chrome firefox uint8array


【解决方案1】:

Chrome 控制台呈现不可打印字符的方式与 firefox 不同。具体来说,不可打印的字符被呈现为空方块。尽管如此,该字符串由正确的 unicode 代码点组成。

以下单行(嗯...)创建\u... 渲染。

Array.from(
    {length: string.length}
  , (v, k) => k
)
   .map ( idx => `\\u${string.codePointAt(idx).toString(16).padStart(4, '0')}`)
   .join()
;

测试一下:

let string = new TextDecoder("utf-8").decode(Uint8Array.from([1, 2, 3]));

console.log(`raw rep: '${string}'.`);
console.log(`code point rep: '${Array.from(
    {length: string.length}
  , (v, k) => k).map ( idx => `\\u${string.codePointAt(idx).toString(16).padStart(4, '0')}` 
).join("")}'.`);

【讨论】:

    猜你喜欢
    • 2011-03-30
    • 2015-10-18
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    相关资源
    最近更新 更多