Es gibt keine Möglichkeit, dies nativ in JavaScript zu tun. (Siehe Riccardo Gallis Antwort für einen modernen Ansatz.)
Zur historischen Bezugnahme oder wenn TextEncoder-APIs noch nicht verfügbar sind .
Wenn Sie die Zeichenkodierung kennen, können Sie sie jedoch selbst berechnen.
encodeURIComponent nimmt UTF-8 als Zeichencodierung an. Wenn Sie diese Codierung benötigen, können Sie Folgendes tun:
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);
}
Dies sollte aufgrund der Art und Weise funktionieren, wie UTF-8 Mehrbyte-Sequenzen codiert. Das erste codierte Byte beginnt immer entweder mit einem hohen Bit von Null für eine einzelne Bytesequenz oder mit einem Byte, dessen erste hexadezimale Ziffer C, D, E oder F ist. Das zweite und nachfolgende Byte sind diejenigen, deren erste zwei Bits 10 sind Dies sind die zusätzlichen Bytes, die Sie in UTF-8 zählen möchten.
Die Tabelle in Wikipedia macht es klarer
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
...
Wenn Sie stattdessen die Seitencodierung verstehen müssen, können Sie diesen Trick verwenden:
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);
}