Non c'è modo di farlo in JavaScript in modo nativo. (Vedi la risposta di Riccardo Galli per un approccio moderno.)
Per riferimento storico o dove le API di TextEncoder non sono ancora disponibili .
Se conosci la codifica dei caratteri, puoi calcolarla da solo.
encodeURIComponent
assume UTF-8 come codifica dei caratteri, quindi se hai bisogno di quella codifica, puoi farlo,
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);
}
Questo dovrebbe funzionare a causa del modo in cui UTF-8 codifica le sequenze multibyte. Il primo byte codificato inizia sempre con un bit alto pari a zero per una singola sequenza di byte o un byte la cui prima cifra esadecimale è C, D, E o F. Il secondo byte e i successivi sono quelli i cui primi due bit sono 10 Questi sono i byte extra che vuoi contare in UTF-8.
La tabella in wikipedia lo rende più chiaro
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
...
Se invece hai bisogno di capire la codifica della pagina, puoi usare questo trucco:
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);
}