В JavaScript нет возможности сделать это изначально. (См . Ответ Риккардо Галли о современном подходе.)
Для исторической справки или для тех случаев, когда 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);
}