Лучший способ подсчета символов в Javascript для чириканья

Из документов API Twitter (http://dev.twitter.com/pages/counting_characters):

предел чит-кода в 140 символов на самом деле не считается символами, а байтами строки.

Как я могу считать байты в строке с помощью Javascript или каждый символ в моей строке всегда использует 2 байта, так как я устанавливаю кодировку моей страницы в UTF-8?

Возможно, у меня уже есть хорошая функция счетчика?

Ответы

Ответ 1

Это правильный ответ: fooobar.com/questions/343502/...

fooobar.com/questions/343502/...

Устаревшие:

Почему бы просто не подсчитать символы? Например, из twitter api

"Café" - это 5 или 6 байтов UTF-8, но предполагается, что оно должно считаться 4 символами.

"café".length == 4

Просто используйте String.length <= 140

Ответ 2

Собственно, из-за укорочения url t.co просто подсчет символов больше не работает. Просмотрите эти две ссылки на Twitter, чтобы узнать, как обрабатывать сокращенные ссылки:

https://support.twitter.com/articles/78124-how-to-shorten-links-urls

https://dev.twitter.com/docs/tco-url-wrapper/how-twitter-wrap-urls

Если вы ищете помощь на стороне клиента, вам нужно будет сделать нового друга с twitter-text.js

https://github.com/twitter/twitter-text-js

Я также разместил прохождение функции, которую я использую, чтобы подсчитать оставшиеся символы в твитте

http://blog.pay4tweet.com/2012/04/27/twitter-lifts-140-character-limit/

Функция выглядит так:

function charactersleft(tweet) {
    var url, i, lenUrlArr;
    var virtualTweet = tweet;
    var filler = "01234567890123456789";
    var extractedUrls = twttr.txt.extractUrlsWithIndices(tweet);
    var remaining = 140;
    lenUrlArr = extractedUrls.length;
    if ( lenUrlArr > 0 ) {
        for (var i = 0; i < lenUrlArr; i++) {
            url = extractedUrls[i].url;
            virtualTweet = virtualTweet.replace(url,filler);
        }
    }
    remaining = remaining - virtualTweet.length;
    return remaining;
}

Функция возвращает количество оставшихся символов, считая, что все URL-адреса, в том числе сокращенные до менее 20 символов, были "сокращены" на t.co до 19 символов плюс пробел.

Предполагается, что включен twitter-text.js.

Ответ 3

Спасибо moluv00 за ваш ответ, который сохранит мне некоторый поиск и поместит меня на правильный путь. Я просто хотел поделиться тем, как я начал обрабатывать счетчики твиттеров (из-за крошечных URL-адресов) в моем приложении.

A запрос на перенос, который был объединен в репозиторий github в 2012-05-31, в котором представлена ​​функция twttr.txt.getTweetLength(текст, параметры), которая учитывает URL-адреса t.co и определяется следующим образом:

twttr.txt.getTweetLength = function(text, options) {
    if (!options) {
        options = {
            short_url_length: 22,
            short_url_length_https: 23
        };
    }
    var textLength = text.length;
    var urlsWithIndices = twttr.txt.extractUrlsWithIndices(text);

    for (var i = 0; i < urlsWithIndices.length; i++) {
        // Subtract the length of the original URL
        textLength += urlsWithIndices[i].indices[0] - urlsWithIndices[i].indices[1];

        // Add 21 characters for URL starting with https://
        // Otherwise add 20 characters
        if (urlsWithIndices[i].url.toLowerCase().match(/^https:\/\//)) {
            textLength += options.short_url_length_https;
        } else {
            textLength += options.short_url_length;
        }
    }

    return textLength;
};

Итак, ваша функция просто станет:

function charactersleft(tweet) {
    return 140 - twttr.txt.getTweetLength(tweet);
}

Кроме того, в отношении лучших методов работы с t.co мы должны получить short_url_length и short_url_length_https из твиттера и передайте их как параметр options в функции twttr.txt.getTweetLength:

Запросить помощь/настройку GET один раз в день в приложении и кешировать "short_url_length" (значение максимальной длины t.co) в течение 24 часов. Кэш "short_url_length_https" (максимальная длина для HTTPS-ссылок t.co) и использовать его как длину URL-адресов на основе HTTPS.

Особо зная, что некоторые изменения в длине URL-адреса t.co будут эффективны в 2013-02-20, как описано в блог разработчика twitter

Ответ 4

Как я могу считать байты в строке с помощью Javascript или каждый символ в моей строке всегда использует 2 байта, так как я устанавливаю кодировку моей страницы в UTF-8?

JavaScript учитывает символы, а не байты. У вас нет проблемы вообще.

"嘰嘰喳喳".length == 4
"Twitter".length == 7

Обновление: вышеизложенное верно только для строк, которые содержат только символы на базовой многоязычной плоскости (BMP).

Определение длины строки не так просто, когда строка содержит символы вне BMP (например, Emoji) или сочетания меток. В следующем сообщении в блоге обсуждается вопрос исчерпывающе, чтение настоятельно рекомендуется: https://mathiasbynens.be/notes/javascript-unicode

Ответ 5

Как упоминалось выше, twitter подсчитывает ссылки как строку длиной 20. В нашем маленьком проекте мы закончили использование следующей части кода:

function getTweetLength(input) {
  var tmp = "";
  for(var i = 0; i < 20; i++){tmp+="o"}
  return input.replace(/(http[s]?:\/\/[\S]*)/g, tmp).length;
};

Если вы используете angular.js, вот небольшой фильтр, который вы можете использовать в своем приложении angular.js:

app.filter('tweetLength', function() {
  return function(input) {
    var tmp = "";
    for(var i = 0; i < 20; i++){tmp+="o"}
    return input.replace(/(http[s]?:\/\/[\S]*)/g, tmp).length;
  };
});

И использование так же просто, как:

Tweet length is {{tweet|tweetLength}}