javascript - JavaScript中的unicode字符串长度以字节为单位

  显示原文与译文双语对照的内容

在我的JavaScript代码中,我需要以这种格式将消息撰写到服务器:


<size in bytes>CRLF


<data>CRLF



例如:

 
3


foo



 

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

我在寻找最大的跨浏览器 方法来计算字符串的长度,以JavaScript为单位。

我尝试了这个来构成我的有效载荷:


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



但它并没有给我更准确的浏览器的( 或者,utf-16 中的那些浏览器中的字符串) 结果。

任何线索?

更新:

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

时间: 原作者:

JavaScript本身没有办法做到这一点。

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

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);


}



原作者:
...