La respuesta de Lauri Oherd funciona bien para la mayoría de las cadenas que se ven en la naturaleza, pero fallará si la cadena contiene caracteres solitarios en el rango de pares sustitutos, 0xD800 a 0xDFFF. P.ej
byteCount(String.fromCharCode(55555))
Esta función más larga debería manejar todas las cadenas:
function bytes (str) {
var bytes=0, len=str.length, codePoint, next, i;
for (i=0; i < len; i++) {
codePoint = str.charCodeAt(i);
if (codePoint >= 0xD800 && codePoint < 0xE000) {
if (codePoint < 0xDC00 && i + 1 < len) {
next = str.charCodeAt(i + 1);
if (next >= 0xDC00 && next < 0xE000) {
bytes += 4;
i++;
continue;
}
}
}
bytes += (codePoint < 0x80 ? 1 : (codePoint < 0x800 ? 2 : 3));
}
return bytes;
}
P.ej
bytes(String.fromCharCode(55555))
Calculará correctamente el tamaño de las cadenas que contienen pares sustitutos:
bytes(String.fromCharCode(55555, 57000))
Los resultados se pueden comparar con la función incorporada de Node Buffer.byteLength
:
Buffer.byteLength(String.fromCharCode(55555), 'utf8')
Buffer.byteLength(String.fromCharCode(55555, 57000), 'utf8')