Die Antwort von Lauri Oherd funktioniert gut für die meisten in freier Wildbahn gesehenen Zeichenfolgen, schlägt jedoch fehl, wenn die Zeichenfolge einzelne Zeichen im Bereich der Ersatzpaare 0xD800 bis 0xDFFF enthält. Z.B
byteCount(String.fromCharCode(55555))
// URIError: URI malformed
Diese längere Funktion sollte alle Zeichenfolgen verarbeiten:
function bytes (str) {
var bytes=0, len=str.length, codePoint, next, i;
for (i=0; i < len; i++) {
codePoint = str.charCodeAt(i);
// Lone surrogates cannot be passed to encodeURI
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;
}
Z.B
bytes(String.fromCharCode(55555))
// 3
Die Größe für Zeichenfolgen mit Ersatzpaaren wird korrekt berechnet:
bytes(String.fromCharCode(55555, 57000))
// 4 (not 6)
Die Ergebnisse können mit der integrierten Funktion von Node verglichen werden Buffer.byteLength
:
Buffer.byteLength(String.fromCharCode(55555), 'utf8')
// 3
Buffer.byteLength(String.fromCharCode(55555, 57000), 'utf8')
// 4 (not 6)