Nie ma możliwości zrobienia tego natywnie w JavaScript. (Zobacz odpowiedź Riccardo Galli na nowoczesne podejście.)
W celach informacyjnych lub w przypadku, gdy interfejsy API TextEncoder są nadal niedostępne .
Jeśli znasz kodowanie znaków, możesz to obliczyć samodzielnie.
encodeURIComponent
przyjmuje UTF-8 jako kodowanie znaków, więc jeśli potrzebujesz tego kodowania, możesz to zrobić,
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);
}
Powinno to działać ze względu na sposób, w jaki UTF-8 koduje sekwencje wielobajtowe. Pierwszy zakodowany bajt zawsze zaczyna się od wysokiego bitu zerowego dla sekwencji jednobajtowej lub bajtu, którego pierwsza cyfra szesnastkowa to C, D, E lub F.Drugi i kolejne bajty to te, których pierwsze dwa bity to 10 To są dodatkowe bajty, które chcesz policzyć w UTF-8.
Stół w Wikipedii czyni to bardziej przejrzystym
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
...
Jeśli zamiast tego chcesz zrozumieć kodowanie strony, możesz użyć tej sztuczki:
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);
}