JavaScript 字符串中有多少个字节?

IT技术 javascript string size byte
2021-02-09 23:03:53

我有一个 javascript 字符串,从服务器以 UTF-8 格式发送时大约为 500K。如何在 JavaScript 中判断它的大小?

我知道 JavaScript 使用 UCS-2,所以这是否意味着每个字符 2 个字节。但是,它是否取决于 JavaScript 实现?或者在页面编码或内容类型上?

6个回答

此函数将返回您传递给它的任何 UTF-8 字符串的字节大小。

function byteCount(s) {
    return encodeURI(s).split(/%..|./).length - 1;
}

来源

JavaScript 引擎可以在内部免费使用 UCS-2 或 UTF-16。我所知道的大多数引擎都使用 UTF-16,但无论他们做出什么选择,这只是一个不会影响语言特性的实现细节。

然而,ECMAScript/JavaScript 语言本身根据 UCS-2 而不是 UTF-16 公开字符。

来源

用于上传到 s3 的 javascript 字符串,s3 显示完全相同的大小 [ (byteCount(s))/ 1024).toFixed(2) + " KiB" ]
2021-03-18 23:03:53
使用.split(/%(?:u[0-9A-F]{2})?[0-9A-F]{2}|./)来代替。对于编码为“%uXXXX”的字符串,您的代码段失败。
2021-03-22 23:03:53
用于 websocket 框架的大小计算,为字符串框架提供与 chrome 开发工具相同的大小。
2021-04-01 23:03:53

您可以使用Blob获取以字节为单位的字符串大小。

例子:

console.info(
  new Blob(['😂']).size,                             // 4
  new Blob(['👍']).size,                             // 4
  new Blob(['😂👍']).size,                           // 8
  new Blob(['👍😂']).size,                           // 8
  new Blob(['I\'m a string']).size,                  // 12

  // from Premasagar correction of Lauri's answer for
  // strings containing lone characters in the surrogate pair range:
  // https://stackoverflow.com/a/39488643/6225838
  new Blob([String.fromCharCode(55555)]).size,       // 3
  new Blob([String.fromCharCode(55555, 57000)]).size // 4 (not 6)
);

啊,例如我们使用 Node.js 使用 Buffer Buffer.from('😂').length
2021-03-21 23:03:53
感谢上帝的斑点!这应该是现代浏览器公认的答案。
2021-03-25 23:03:53
如何在 Node.js 中导入 Blob?
2021-04-01 23:03:53

如果您使用的是 node.js,则使用buffers有一个更简单的解决方案

function getBinarySize(string) {
    return Buffer.byteLength(string, 'utf8');
}

有一个 npm 库:https : //www.npmjs.org/package/utf8-binary-cutter(忠实地来自你)

String值不依赖于实现,根据ECMA-262 第 3 版规范,每个字符代表一个UTF-16 文本的 16 位单元

4.3.16 字符串值

字符串值是 String 类型的成员,是零个或多个 16 位无符号整数值的有限有序序列。

注意 尽管每个值通常代表一个 UTF-16 文本的单个 16 位单元,但语言对这些值没有任何限制或要求,只是它们是 16 位无符号整数。

我认为 Firefox 在内部甚至可以为某些字符串使用每个字符 1 个字节.... blog.mozilla.org/javascript/2014/07/21 /...
2021-03-24 23:03:53
我对那段话的阅读并不意味着实现独立。
2021-03-25 23:03:53
UTF-16 不能保证,只有字符串存储为 16 位整数的事实。
2021-03-30 23:03:53
它仅与 UTF-16 相关的实现有关。16 位字符描述是通用的。
2021-04-05 23:03:53
UTF-16 明确不允许我阅读它的方式。UTF-16 字符最多可以有 4 个字节,但规范说“值必须是 16 位无符号整数”。这意味着 JavaScript 字符串值是 UTF-16 的子集,但是,不允许使用任何使用 3 或 4 个字节字符的 UTF-16 字符串。
2021-04-07 23:03:53

试试这个结合使用unescape js 函数:

const byteAmount = unescape(encodeURIComponent(yourString)).length

完整编码过程示例:

const s  = "1 a ф № @ ®"; // length is 11
const s2 = encodeURIComponent(s); // length is 41
const s3 = unescape(s2); // length is 15 [1-1,a-1,ф-2,№-3,@-1,®-2]
const s4 = escape(s3); // length is 39
const s5 = decodeURIComponent(s4); // length is 11
@LauriOherd 我知道评论很旧,但是:在这个答案中,unescape没有用于解码URI。它用于将%xx序列转换为单个字符。AsencodeURIComponent将字符串编码为 UTF-8,将代码单元表示为其相应的 ASCII 字符或%xx序列,调用unescape(encodeURIComponent(...))结果是包含原始字符串的 UTF-8 表示的二进制字符串。.length正确调用会给出编码为 UTF-8 的字符串的字节大小。
2021-03-14 23:03:53
是的 ( un)escape自 1999 年以来已被弃用,但它仍然在每个浏览器中可用...... - 也就是说,有充分的理由弃用它。基本上没有办法正确使用它们(除了结合en-/ decodeURI( Component)对 UTF8 进行编码/解码- 或者至少我不知道 ( un) 的任何其他有用的应用程序escape)。今天有更好的替代方法来编码/解码 UTF8(TextEncoder等)
2021-03-27 23:03:53
unescapeJavaScript函数已被废弃,不应该被用来解码统一资源标识符(URI)。来源
2021-03-31 23:03:53