Jawaban dari Lauri Oherd berfungsi dengan baik untuk sebagian besar string yang terlihat di alam liar, tetapi akan gagal jika string berisi karakter tunggal dalam rentang pasangan pengganti, 0xD800 hingga 0xDFFF. Misalnya
byteCount(String.fromCharCode(55555))
Fungsi yang lebih panjang ini harus menangani semua string:
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;
}
Misalnya
bytes(String.fromCharCode(55555))
Ini akan menghitung dengan benar ukuran string yang berisi pasangan pengganti:
bytes(String.fromCharCode(55555, 57000))
Hasilnya dapat dibandingkan dengan fungsi bawaan Node Buffer.byteLength
:
Buffer.byteLength(String.fromCharCode(55555), 'utf8')
Buffer.byteLength(String.fromCharCode(55555, 57000), 'utf8')