【问题标题】:Browser buffer to string conversion is not same in browser and nodejs浏览器缓冲区到字符串的转换在浏览器和 nodejs 中不同
【发布时间】:2017-09-03 14:34:19
【问题描述】:

我遇到了一个有趣的问题。 我正在使用节点 v8.1.4

我有以下缓冲区。

[ 191, 164, 235, 131, 30, 28, 164, 179, 101, 138, 94, 36, 115, 176, 83, 193, 9, 177, 85, 228, 189, 193, 127, 71, 165, 16, 211, 132, 228, 241, 57, 207, 254, 152, 122, 98, 100, 71, 67, 100, 29, 218, 165, 101, 25, 17, 177, 173, 92, 173, 162, 186, 198, 1, 80, 94, 228, 165, 124, 171, 78, 49, 145, 158 ] 

当我尝试使用 nodejs 并使用浏览器将其转换为 utf8 时,我得到了不同的结果。连字符串的长度都不一样。

有没有办法像node js一样在浏览器中将字符串转换为utf8?

nodejs 替换为 U+FFFD 的某些序列的某些字符似乎比浏览器中替换的序列更长。所以输出的utf8字符串是不同的

我在浏览器和 nodejs 中使用的代码是相同的 我有缓冲区对象 tmpString

  tmpString.toString('utf-8')

tmpString.toString('utf-8').length 在浏览器和 nodejs 中对于相同的源字节不同。

在 nodejs 中我使用原生缓冲区实现,浏览器 webpack 加载 polyfill(我认为是 feross/buffer)

我认为更准确的说法是我尝试将缓冲区字节解释为 UTF8 字符串。

【问题讨论】:

  • “转换为 UTF8”是什么意思?您的意思是“解释为 UTF8 字符串”,还是“将此 XY 编码缓冲区转换为 UTF8 缓冲区”?请显示您在 node 中使用的代码,以及您尝试在浏览器中使用的代码。
  • 更新详情。似乎正确地说我尝试将缓冲区解释为 utf8 字符串
  • 如果您使用节点 Buffer polyfill 并且它的功能与原生节点不同,您可能应该将此测试用例报告为错误。
  • 谢谢,会努力寻找解决办法。

标签: javascript node.js string utf-8


【解决方案1】:

您是否尝试过 TextEncoder/TextDecoder API?我已经使用它们在 nodejs 和浏览器中转换字符串,并没有看到任何差异。

例如:

const encoder = new TextEncoder('utf-8');
const decoder = new TextDecoder('utf-8');

const foo = 'Hello world!';
const encoded = encoder.encode(foo);
console.log(encoded);

const decoded = decoder.decode(encoded);
console.log(decoded);

【讨论】:

  • 是的,它产生与浏览器 toString() 相同的输出,可能它比 nodejs 更正确,但我正在寻找相同的行为。
  • 您确定浏览器的 toString() 方法将缓冲区转换为编码的 utf-8 字符串吗?我找不到任何信息表明这是一种存在的方法。当我在 Uint8Array 缓冲区上使用 toString() 时,它会打印用逗号连接的字节值,如果我在 ArrayBuffer 上使用 toString(),它会打印“[object ArrayBuffer]”。我们在做一些不同的事情吗?
  • Nodejs Buffer 覆盖 toString 方法,使用提供的编码解码字符串,而不是输出元素。
  • 在 Nodejs 中是的,但不是在浏览器中。或者您是否也在使用一些在浏览器中覆盖它的脚本?如果是这样的话,那可能就是问题所在。
  • 谢谢,我正在寻找问题所在。因为 polyfill 代码看起来非常接近原始代码。所以看起来魔鬼在小细节。
猜你喜欢
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 2016-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多