Câu trả lời từ Lauri Oherd hoạt động tốt đối với hầu hết các chuỗi được thấy trong tự nhiên, nhưng sẽ không thành công nếu chuỗi chứa các ký tự đơn lẻ trong phạm vi cặp thay thế, 0xD800 đến 0xDFFF. Ví dụ
byteCount(String.fromCharCode(55555))
Hàm dài hơn này sẽ xử lý tất cả các chuỗi:
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;
}
Ví dụ
bytes(String.fromCharCode(55555))
Nó sẽ tính toán chính xác kích thước cho các chuỗi chứa các cặp thay thế:
bytes(String.fromCharCode(55555, 57000))
Kết quả có thể được so sánh với chức năng tích hợp của Node Buffer.byteLength
:
Buffer.byteLength(String.fromCharCode(55555), 'utf8')
Buffer.byteLength(String.fromCharCode(55555, 57000), 'utf8')