기본적으로 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이 멀티 바이트 시퀀스를 인코딩하는 방식 때문에 작동합니다. 첫 번째 인코딩 된 바이트는 항상 단일 바이트 시퀀스의 경우 0의 상위 비트 또는 첫 번째 16 진수 숫자가 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);
}