Длина строки в байтах в JavaScript - PullRequest
76 голосов
/ 01 апреля 2011

В моем коде JavaScript мне нужно составить сообщение на сервер в следующем формате:

<size in bytes>CRLF
<data>CRLF

Пример:

3
foo

Данные могут содержать символы Юникода.Мне нужно отправить их как UTF-8.

Я ищу наиболее кросс-браузерный способ вычисления длины строки в байтах в JavaScript.

Я пробовал эточтобы составить мою полезную нагрузку:

return unescape(encodeURIComponent(str)).length + "\n" + str + "\n"

Но это не дает точных результатов для старых браузеров (или, может быть, строк в этих браузерах в UTF-16?).

Любые подсказки?

Обновление:

Пример: длина в байтах строки ЭЭХ! Naïve? в UTF-8 составляет 15 байтов, но некоторые браузеры вместо этого сообщают о 23 байтах.

Ответы [ 12 ]

1 голос
/ 21 декабря 2016

Это будет работать для символов BMP и SIP / SMP.

    String.prototype.lengthInUtf8 = function() {
        var asciiLength = this.match(/[\u0000-\u007f]/g) ? this.match(/[\u0000-\u007f]/g).length : 0;
        var multiByteLength = encodeURI(this.replace(/[\u0000-\u007f]/g)).match(/%/g) ? encodeURI(this.replace(/[\u0000-\u007f]/g, '')).match(/%/g).length : 0;
        return asciiLength + multiByteLength;
    }

    'test'.lengthInUtf8();
    // returns 4
    '\u{2f894}'.lengthInUtf8();
    // returns 4
    'سلام علیکم'.lengthInUtf8();
    // returns 19, each Arabic/Persian alphabet character takes 2 bytes. 
    '你好,JavaScript 世界'.lengthInUtf8();
    // returns 26, each Chinese character/punctuation takes 3 bytes. 
1 голос
/ 10 января 2013

Вы можете попробовать это:

function getLengthInBytes(str) {
  var b = str.match(/[^\x00-\xff]/g);
  return (str.length + (!b ? 0: b.length)); 
}

Это работает для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...