Лучший способ посчитать символы в Javascript для твита - PullRequest
15 голосов
/ 05 июня 2011

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

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

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

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

Ответы [ 4 ]

21 голосов
/ 28 апреля 2012

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

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

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

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 включен.

19 голосов
/ 07 декабря 2012

Спасибо 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 из твиттера и передать их в качестве параметров Параметр в функции twttr.txt.getTweetLength :

Запросите ПОЛУЧИТЬ справку / конфигурацию один раз в день в своем приложении и кэшируйте «short_url_length» (текущее значение максимальной длины t.co) в течение 24 часов. Кэшируйте «short_url_length_https» (максимальная длина для ссылок t.co на основе HTTPS) и используйте его в качестве длины URL-адресов на основе HTTPS.

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

3 голосов
/ 06 января 2015

Как уже упоминалось, твиттер считает ссылки как строку длиной 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}}
2 голосов
/ 06 июня 2011

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

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

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

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

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

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