Bunu yerel olarak JavaScript'te yapmanın bir yolu yoktur. ( Riccardo Galli'nin modern bir yaklaşım için cevabına bakın .)
Tarihsel referans için veya TextEncoder API'lerinin hala kullanılamadığı durumlarda .
Karakter kodlamasını biliyorsanız, bunu kendiniz de hesaplayabilirsiniz.
encodeURIComponent
karakter kodlaması olarak UTF-8'i varsayar, bu nedenle bu kodlamaya ihtiyacınız varsa,
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);
}
Bu, UTF-8'in çok baytlı dizileri kodlama biçimi nedeniyle çalışmalıdır. İlk kodlanmış bayt her zaman ya tek bir bayt dizisi için yüksek bir sıfır bitiyle ya da ilk onaltılık basamağı C, D, E veya F olan bir baytla başlar. İkinci ve sonraki baytlar, ilk iki biti 10 olan baytlardır. Bunlar UTF-8'de saymak istediğiniz fazladan baytlardır.
Wikipedia'daki tablo daha net hale getiriyor
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
...
Bunun yerine sayfa kodlamasını anlamanız gerekiyorsa, şu numarayı kullanabilirsiniz:
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);
}