Lauri Oherd'den gelen yanıt, vahşi ortamda görülen çoğu dizge için iyi çalışıyor, ancak dize, 0xD800 ila 0xDFFF vekil çift aralığında yalnız karakterler içeriyorsa başarısız olacaktır. Örneğin
byteCount(String.fromCharCode(55555))
Bu daha uzun işlev tüm dizeleri işlemelidir:
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;
}
Örneğin
bytes(String.fromCharCode(55555))
Vekil çiftleri içeren dizelerin boyutunu doğru bir şekilde hesaplayacaktır:
bytes(String.fromCharCode(55555, 57000))
Sonuçlar Node'un yerleşik işlevi ile karşılaştırılabilir Buffer.byteLength
:
Buffer.byteLength(String.fromCharCode(55555), 'utf8')
Buffer.byteLength(String.fromCharCode(55555, 57000), 'utf8')