在 Javascript 中计算推文字符数的最佳方法

问题描述 投票:0回答:5

来自 Twitter API 文档 ( http://dev.twitter.com/pages/counting_characters ):

140 个字符的推文限制并没有真正计算字符数,而是计算字符串的字节数。

如何使用 Javascript 计算字符串中的字节数,或者自从我将页面编码设置为 UTF-8 后,字符串中的每个字符总是使用 2 个字节?

也许已经有一个不错的计数器功能供我使用?

javascript twitter
5个回答
21
投票

实际上,由于 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 个字符的 URL)已被 t.co“缩短”为 19 个字符加一个空格。

假设包含 twitter-text.js。


19
投票

感谢moluv00的回答,让我节省了一些搜索时间,并使我走上了正确的道路。 我只是想分享我在应用程序中处理 Twitter 字符计数(由于网址很小)的方法。

一个拉取请求已于2012年5月31日合并到github存储库,引入了twttr.txt.getTweetLength(text, options)函数,该函数考虑了t.co URL并定义如下:

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 的最佳实践,我们应该从 twitter 检索 short_url_lengthshort_url_length_https 值,并将它们作为 twttr.txt.getTweetLength 函数中的 options 参数传递:

每天在您的应用程序中请求一次 GET 帮助/配置,并将“short_url_length”(t.co 当前的最大长度值)缓存 24 小时。缓存“short_url_length_https”(基于 HTTPS 的 t.co 链接的最大长度)并将其用作基于 HTTPS 的 URL 的长度。

特别要知道

t.co 网址长度的一些更改将于 2013 年 2 月 20 日生效,如 twitter 开发者博客中所述


3
投票
正如其他人提到的,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}}
    

2
投票
如何使用 Javascript 计算字符串中的字节数,或者自从我将页面编码设置为 UTF-8 后,字符串中的每个字符总是使用 2 个字节?

JavaScript 计算的是字符而不是字节。

你完全没有问题。

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

更新:以上仅适用于只包含基本多语言平面 (BMP) 中的字符的字符串。

当字符串包含 BMP 外部的字符(如表情符号)或组合标记时,确定字符串长度就不是那么简单了。以下博客文章详尽地讨论了这个问题,强烈建议阅读:

https://mathiasbynens.be/notes/javascript-unicode


0
投票
Twitter 将以下字符范围计为 1 个字符:

U+0000..U+10ff, U+2000..U+200D, U+2010..U+201F, U+2032..U+2037
其他所有内容均计为 2 个字符。

考虑到 Javascript 将星体平面(U+10000 及以上)编码为一对 UTF-16 代理项(因此

"😁".length == 2

),我想出了以下内容

function count_tweet_chars(str){ var char2 = str.match(/[^\u0000-\u10ff,\u2000-\u200D,\u2010-\u201F,\u2032-\u2037,\uD800-\uDfff]/g) || []; return str.length + char2.length; }
请注意,上述内容不包括将 t.co 23 字符 url 替换为 url,而且它也无法正确计算 🎅🏽 等多字符字素

© www.soinside.com 2019 - 2024. All rights reserved.