ไม่มีวิธีทำใน JavaScript โดยกำเนิด (ดูคำตอบของ Riccardo Galliสำหรับแนวทางสมัยใหม่)
สำหรับการอ้างอิงประวัติศาสตร์หรือที่ TextEncoder API ที่มียังคงสามารถใช้งานได้
หากคุณรู้จักการเข้ารหัสอักขระคุณสามารถคำนวณได้ด้วยตัวเอง
encodeURIComponent
ถือว่า UTF-8 เป็นการเข้ารหัสอักขระดังนั้นหากคุณต้องการการเข้ารหัสนั้นคุณสามารถทำได้
function lengthInUtf8Bytes(str) {
// Matches only the 10.. bytes that are non-initial characters in a multi-byte sequence.
var m = encodeURIComponent(str).match(/%[89ABab]/g);
return str.length + (m ? m.length : 0);
}
สิ่งนี้ควรใช้งานได้เนื่องจากวิธีที่ UTF-8 เข้ารหัสลำดับแบบหลายไบต์ ไบต์แรกที่เข้ารหัสจะเริ่มต้นด้วยบิตสูงของศูนย์สำหรับลำดับไบต์เดียวหรือไบต์ที่มีเลขฐานสิบหกหลักแรกคือ C, D, E หรือ F ไบต์ที่สองและตามมาคือบิตที่มีสองบิตแรกคือ 10 นี่คือไบต์พิเศษที่คุณต้องการนับใน UTF-8
ตารางในwikipediaทำให้ชัดเจนขึ้น
Bits Last code point Byte 1 Byte 2 Byte 3
7 U+007F 0xxxxxxx
11 U+07FF 110xxxxx 10xxxxxx
16 U+FFFF 1110xxxx 10xxxxxx 10xxxxxx
...
หากคุณจำเป็นต้องเข้าใจการเข้ารหัสเพจแทนคุณสามารถใช้เคล็ดลับนี้:
function lengthInPageEncoding(s) {
var a = document.createElement('A');
a.href = '#' + s;
var sEncoded = a.href;
sEncoded = sEncoded.substring(sEncoded.indexOf('#') + 1);
var m = sEncoded.match(/%[0-9a-f]{2}/g);
return sEncoded.length - (m ? m.length * 2 : 0);
}