来自Twitter API文档(http://dev.twitter.com/pages/counting_characters):
140个字符的tweet限制并不真正计算字符数,而是字符串的字节数。
我如何使用Javascript计算字符串中的字节数,或者我的字符串中的每个字符总是使用2个字节,因为我将页面的编码设置为UTF-8?
也许我已经有一个很好的计数器功能供我使用了?
答案 0 :(得分:21)
实际上,由于t.co url shortener,只计算字符不再起作用。查看这两个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。
答案 1 :(得分:19)
感谢moluv00您的回答,为我节省了一些搜索并让我走上正轨。 我只想分享我在我的应用程序中处理推特字符计数(由于小网址)的方式。
2012-05-31在pull request上合并the github repository,引入了考虑到t的 twttr.txt.getTweetLength(文字,选项)功能.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);
}
另外,关于the best practices with t.co,我们应该从twitter检索 short_url_length 和 short_url_length_https 值,并将其作为选项参数传递给 twttr.txt.getTweetLength 功能:
在您的应用程序中每天请求一次GET帮助/配置,并将“short_url_length”(t.co的当前最大长度值)缓存24小时。缓存“short_url_length_https”(基于HTTPS的t.co链接的最大长度),并将其用作基于HTTPS的URL的长度。
特别知道 t.co网址长度的某些变化将在2013-02-20 生效,如in the twitter developer blog所述
答案 2 :(得分: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中使用的小过滤器:
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}}
答案 3 :(得分:2)
我如何使用Javascript计算字符串中的字节数,或者我的字符串中的每个字符总是使用2个字节,因为我将页面的编码设置为UTF-8?
JavaScript计算字符而不是字节。 你根本没有问题。
"嘰嘰喳喳".length == 4
"Twitter".length == 7
更新:以上内容仅适用于除基本多语种平面(BMP)中只包含字符的字符串。
当字符串包含来自BMP外部的字符(如表情符号)或组合标记时,确定字符串长度并不是那么简单。以下博客文章详尽地讨论了这个问题,强烈建议阅读它:https://mathiasbynens.be/notes/javascript-unicode