在我的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);
}
问题内容: 给定特定对象,有没有一种方法可以计算不使用任何GUI组件的字符串的长度(以像素为单位)? 问题答案: 那不使用任何GUI组件? 这取决于您在这里的意思。我假设您的意思是您希望在不收到的情况下进行此操作。 最好的方法是使用。AFAIK,这不会抛出: 除了使用类似的方法,我认为您不能。您需要图形上下文才能创建并提供字体大小信息。
在Swift2.2中,我们如何找出字符串的长度(字节)? 我知道一个出路是使用
返回字符串的字节长度。 将给定的字符串转换为Blob Object并查找其 size 。 const byteSize = str => new Blob([str]).size; byteSize('
如何获得存储在变量中的字符串长度并将其分配给另一个变量? 如何将另一个变量设置为输出?
问题内容: 有没有办法在不知道字符串长度的情况下,将一个字符长的字符串切成4个字符串,每个字符长? 例如: 问题答案:
要求出字符串的长度(字符的个数),我们可以使用length函数。调用这个函数的语法和我们前面看到的有点不同: int length; length = fruit.length(); 对于这种函数调用,我们称之为在字符串变量fruit上**调用(invoke)**length函数。“调用(invoke)”这个词可能看起来有点奇怪,但是后面我们还会遇到很多在对象上调用函数的例子。 函数调用的语法称