Não há como fazer isso nativamente em JavaScript. (Veja a resposta de Riccardo Galli para uma abordagem moderna.)
Para referência histórica ou onde APIs de TextEncoder ainda não estão disponíveis .
Se você conhece a codificação de caracteres, pode calculá-la sozinho.
encodeURIComponent
assume UTF-8 como a codificação de caracteres, então se você precisa dessa codificação, você pode fazer,
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);
}
Isso deve funcionar devido à maneira como o UTF-8 codifica sequências de bytes múltiplos. O primeiro byte codificado sempre começa com um bit alto de zero para uma única sequência de bytes ou um byte cujo primeiro dígito hexadecimal é C, D, E ou F. O segundo e subsequentes bytes são aqueles cujos primeiros dois bits são 10 Esses são os bytes extras que você deseja contar em UTF-8.
A tabela na wikipedia torna isso mais claro
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
...
Se, em vez disso, você precisa entender a codificação da página, pode usar este truque:
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);
}