JavaScript中的字符串长度(以字节为单位)

在我的JavaScript代码中,我需要以以下格式编写一条消息到服务器:

<size in bytes>CRLF

<data>CRLF

例:

3

foo

数据可能包含unicode字符。我需要将它们作为UTF-8发送。

我正在寻找最跨浏览器的方法来计算JavaScript中字符串的长度(以字节为单位)。

我已经尝试过以此来组成我的有效载荷:

return unescape(encodeURIComponent(str)).length + "\n" + str + "\n"

但是对于较旧的浏览器(或者,也许是UTF-16中的那些浏览器中的字符串?),它不能为我提供准确的结果。

有什么线索吗?

更新:

示例:ЭЭХ! Naïve?UTF-8中字符串的字节长度为15个字节,但是某些浏览器却报告为23个字节。

回答:

如果您知道字符编码,则可以自己计算。

encodeURIComponent 假定UTF-8为字符编码,因此,如果需要该编码,可以这样做,

function lengthInUtf8Bytes(str) {

// Matches only the 10.. bytes that are non-initial characters in a multi-byte sequence.

var m = encodeURIComponent(str).match(/%[89ABab]/g);

return str.length + (m ? m.length : 0);

}

由于UTF-8编码多字节序列的方式,因此应该可以使用。对于单个字节序列,第一个编码字节始终以零的高位开头,或者第一个十六进制数字为C,D,E或F的字节开始。第二个和后续字节是前两个位为10的字节这些是要在UTF-8中计数的额外字节。

维基百科中的表格更加清晰

Bits        Last code point Byte 1          Byte 2          Byte 3

7 U+007F 0xxxxxxx

11 U+07FF 110xxxxx 10xxxxxx

16 U+FFFF 1110xxxx 10xxxxxx 10xxxxxx

...

相反,如果您需要了解页面编码,则可以使用以下技巧:

function lengthInPageEncoding(s) {

var a = document.createElement('A');

a.href = '#' + s;

var sEncoded = a.href;

sEncoded = sEncoded.substring(sEncoded.indexOf('#') + 1);

var m = sEncoded.match(/%[0-9a-f]{2}/g);

return sEncoded.length - (m ? m.length * 2 : 0);

}

以上是 JavaScript中的字符串长度(以字节为单位) 的全部内容, 来源链接: utcz.com/qa/421379.html

回到顶部