Немає способу зробити це в JavaScript на самому собі. (Дивіться відповідь Ріккардо Галлі про сучасний підхід.)
Для історичної довідки або де API API TextEncoder ще недоступні .
Якщо ви знаєте кодування символів, ви можете самі обчислити його.
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.
Таблиця у Вікіпедії робить її більш зрозумілою
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);
}