No hay forma de hacerlo en JavaScript de forma nativa. (Vea la respuesta de Riccardo Galli para un enfoque moderno).
Para referencia histórica o donde las API de TextEncoder aún no están disponibles .
Si conoce la codificación de caracteres, puede calcularla usted mismo.
encodeURIComponent
asume UTF-8 como la codificación de caracteres, por lo que si necesita esa codificación, puede hacerlo,
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);
}
Esto debería funcionar debido a la forma en que UTF-8 codifica secuencias de varios bytes. El primer byte codificado siempre comienza con un bit alto de cero para una secuencia de un solo byte, o un byte cuyo primer dígito hexadecimal es C, D, E o F. El segundo y subsiguientes bytes son aquellos cuyos primeros dos bits son 10 Esos son los bytes adicionales que desea contar en UTF-8.
La tabla en wikipedia lo aclara
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, en cambio, necesita comprender la codificación de la página, puede usar este truco:
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);
}