JavaScriptでネイティブに行う方法はありません。(最新のアプローチについては、Riccardo Galliの回答を参照してください。)
歴史的な参照のため、またはTextEncoder APIがまだ利用できない場合。
文字エンコーディングがわかっている場合は、自分で計算できます。
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がマルチバイトシーケンスをエンコードする方法のため、これは機能するはずです。最初のエンコードされたバイトは常に、単一バイトシーケンスのゼロの上位ビット、または最初の16進数がC、D、E、またはFのバイトで始まります。2番目以降のバイトは、最初の2ビットが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);
}