2011-12-21 30 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