2011-12-21 84 views
4

可能重复:
How many bytes in a JavaScript string?
String length in bytes in JavaScriptNode.js:字符串中有多少位?

我如何计算在一个字符串有多少位? 其实我需要的是JavaScript(V8)字符串中有多少个八位字节(8位字节)? 如果不可能知道,有没有其他字符数据结构可以在这里有所帮助,而不是字符串?

UPDATE:为UTF-8编码

+2

你究竟想要完成什么? – 2011-12-21 10:38:35

+2

我想将它作为http响应主体发送回浏览器,我需要知道内容长度,我不想使用'http'模块。 – user1109648 2011-12-21 11:01:10

+0

取决于字符集和编码。如果它是ASCII,则以ASCII形式传输,然后每个字符一个字节。如果它的Unicode以UTF-8格式传输,那么......你需要做一些计算! – 2011-12-21 11:46:28

回答

3

假设你只使用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中看作代理对,您必须标识...

更新:我更新了代码,以便它可以与所有的Uni代码, 不仅BMP。然而,这个代码现在依赖于一个强有力的假设:给定的 字符串是正确的 UTF-16。它通过计算在字符串中找到的每个 代理的两个字节来计算。事实是代理 被编码为UTF-8中的4个字节,并且在对之外不应找到替代物 。

+0

你能解释一下'0x007f'是什么?它代表什么? – user1109648 2011-12-21 14:03:58

+0

0x007f在十六进制中为127:这是ASCII码的上限,Unicode编码的最高编码为UTF-8中的单个字节。 0x07ff是编码为两个字节的最高编码点。参见[Wikipedia:UTF-8](http://en.wikipedia.org/wiki/Utf8)。 – 2011-12-21 14:28:35