Ya no busques más por todo internet porque has llegado al lugar perfecto, tenemos la respuesta que necesitas sin complicaciones.
Solución:
Pasaron los años y hoy en día puedes hacerlo de forma nativa
(new TextEncoder().encode('foo')).length
Tenga en cuenta que no es compatible con IE (puede usar un polyfill para eso).
Documentación de MDN
Especificaciones estándar
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.
Sin embargo, 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 los siguientes bytes son aquellos cuyos dos primeros bits son 10 Esos son los bytes adicionales que desea contar en UTF-8.
La tabla en wikipedia lo deja más claro.
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);
Aquí hay una versión mucho más rápida, que no usa expresiones regulares ni encodeURIComponent():
function byteLength(str)
// returns the byte length of an utf8 string
var s = str.length;
for (var i=str.length-1; i>=0; i--)
var code = str.charCodeAt(i);
if (code > 0x7f && code <= 0x7ff) s++;
else if (code > 0x7ff && code <= 0xffff) s+=2;
if (code >= 0xDC00 && code <= 0xDFFF) i--; //trail surrogate
return s;
Aquí hay un actuación comparación.
Simplemente calcula la longitud en UTF8 de cada punto de código Unicode devuelto por charCodeAt() (basado en las descripciones de wikipedia de UTF8 y UTF16 caracteres sustitutos).
Sigue RFC3629 (donde los caracteres UTF-8 tienen una longitud máxima de 4 bytes).
Sección de Reseñas y Valoraciones
Más adelante puedes encontrar las crónicas de otros sys admins, tú igualmente eres capaz mostrar el tuyo si dominas el tema.