Il n'y a aucun moyen de le faire en JavaScript de manière native. (Voir la réponse de Riccardo Galli pour une approche moderne.)
Pour référence historique ou lorsque les API TextEncoder ne sont toujours pas disponibles .
Si vous connaissez le codage des caractères, vous pouvez le calculer vous-même.
encodeURIComponent
suppose UTF-8 comme encodage de caractères, donc si vous avez besoin de cet encodage, vous pouvez faire,
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);
}
Cela devrait fonctionner en raison de la façon dont UTF-8 encode les séquences multi-octets. Le premier octet codé commence toujours par soit un bit haut de zéro pour une séquence à un octet, soit un octet dont le premier chiffre hexadécimal est C, D, E ou F.Le deuxième octet et les suivants sont ceux dont les deux premiers bits sont 10 Ce sont les octets supplémentaires que vous voulez compter en UTF-8.
La table dans wikipedia le rend plus clair
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
...
Si à la place vous avez besoin de comprendre l'encodage de la page, vous pouvez utiliser cette astuce:
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);
}