在 JavaScript 中,没有办法在 JavaScript 中本地做到这一点。(参见Riccardo Galli的答案,了解现代方法。
用于历史参考或文本编码器 API 仍然不可用的地方。
如果您知道字符编码,则可以自己计算。
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);
}