Если вы используете однобайтовую кодировку, да, 8192 символа = 8192 байта. Если вы используете UTF-16, 8192 символа (*) = 4096 байт.
(На самом деле 8192 кодовых точек, что немного отличается от суррогатов, но давайте не будем об этом беспокоиться, потому что JavaScript этого не делает.)
Если вы используете UTF-8, есть быстрый прием, который можно использовать для реализации кодера / декодера UTF-8 в JS с минимальным кодом:
function toBytesUTF8(chars) {
return unescape(encodeURIComponent(chars));
}
function fromBytesUTF8(bytes) {
return decodeURIComponent(escape(bytes));
}
Теперь вы можете обрезать с помощью:
function truncateByBytesUTF8(chars, n) {
var bytes= toBytesUTF8(chars).substring(0, n);
while (true) {
try {
return fromBytesUTF8(bytes);
} catch(e) {};
bytes= bytes.substring(0, bytes.length-1);
}
}
(Причина попытки перехвата заключается в том, что если вы урежете байты в середине многобайтовой последовательности символов, вы получите недопустимый поток UTF-8, и decodeURIComponent будет жаловаться.)
Если это другая многобайтовая кодировка, такая как Shift-JIS или Big5, вы сами по себе.