Saltar al contenido

Longitud de cadena en bytes en JavaScript

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *