【问题标题】:Node.js: how many bits in a String? [duplicate]Node.js:字符串中有多少位? [复制]
【发布时间】:2012-01-25 04:24:58
【问题描述】:

可能重复:
How many bytes in a JavaScript string?
String length in bytes in JavaScript

如何计算字符串中有多少位? 实际上我需要的是 JavaScript(V8) 字符串中有多少个八位字节(8 位字节)? 如果无法知道,这里有没有其他字符数据结构可以代替String?

更新:用于 UTF-8 编码

【问题讨论】:

  • 你到底想完成什么?
  • 我想将它作为http响应体发送回浏览器,我需要知道内容长度,我不想使用'http'模块。
  • 取决于字符集和编码。如果它是 ASCII,作为 ASCII 传输,那么每个字符一个字节。如果它是作为 UTF-8 传输的 Unicode,那么……你需要做一些计算!
  • 我不了解 node.js,但原则上 JS 字符串本身没有编码(嗯,实际上它在内部被处理为 UTF-16,但这可能无关紧要)。在将字符串序列化为八位字节流时​​,您需要选择一种编码。您需要告诉浏览器您选择的编码,通常使用适当的 HTTP 标头。
  • 我明白了,所以当我将String写入套接字时,默认为UTF-8,我该如何计算这种编码的八位字节数?

标签: javascript string node.js


【解决方案1】:

假设您只使用 BMP 字符

/* Compute length of UTF-8 serialization of string s. */
function utf8Length(s)
{
    var l = 0;
    for (var i = 0; i < s.length; i++) {
        var c = s.charCodeAt(i);
        if (c <= 0x007f) l += 1;
        else if (c <= 0x07ff) l += 2;
        else if (c >= 0xd800 && c <= 0xdfff)  l += 2;  // surrogates
        else l += 3;
    }
    return l;
}

如果您退出 BMP(即使用 0xffff 以上的字符),事情会变得更加复杂,因为它们在 JavaScript 中将被视为您必须识别的代理对...

更新:我更新了代码,使其适用于所有 Unicode, 不仅是 BMP。 然而,这段代码现在依赖于一个强有力的假设:给定的 字符串 正确 UTF-16。它通过为每个计算两个字节来工作 在字符串中找到代理项。事实上,一个代理pair 在 UTF-8 中被编码为 4 个字节,并且永远不会找到代理项 在一对之外。

【讨论】:

  • 你能解释一下什么是'0x007f'吗?它代表什么?
  • 0x007f 是十六进制的 127:它是 ASCII 的上限,也是 UTF-8 中编码为单个字节的最高 Unicode 代码点。 0x07ff 是编码为两个字节的最高代码点。见Wikipedia:UTF-8
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多