在 JavaScript 中本机无法做到这一点。(有关现代方法,请参阅Riccardo Galli 的回答。)
用于历史参考或 TextEncoder 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 编码多字节序列的方式,这应该有效。第一个编码字节总是以单个字节序列的高位 0 或第一个十六进制数字为 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);
}