我该如何使用 JavaScript 计算字符串的字节数?或者因为我将页面编码设置为 UTF-8,所以我的每个字符始终使用 2 个字节?
也许已经有一个好用的计数器函数可以供我使用了?
由于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"。
charactersleft = function(tweet) { remaining = 140 - twttr.txt.getTweetLength(tweet); return remaining; }
- yigitbacakoglu感谢 moluv00 的回答,它让我省去了一些搜索并使我走上了正确的轨道。 我只想分享我处理应用程序中 Twitter 字符计数(由于 Tiny URLs)的方法。
拉取请求已于 2012-05-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_length 和short_url_length_https 的值,并将它们作为选项参数传递给twttr.txt.getTweetLength 函数:
在您的应用程序中每天请求GET help/configuration一次,并缓存“short_url_length”(t.co当前的最大长度值)24小时。缓存“short_url_length_https”(基于HTTPS的t.co链接的最大长度),并将其用作基于HTTPS的URL的长度。
尤其要知道,如Twitter开发者博客中所述,某些有关t.co URL长度的更改将在2013-02-20生效。
正如其他人所提到的那样,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;
};
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}}
我该如何使用Javascript计算字符串中的字节数?还是因为我将页面编码设置为UTF-8,所以我的字符串中的每个字符总是使用2个字节?
JavaScript计算的是字符而不是字节。你根本没有问题。
"嘰嘰喳喳".length == 4
"Twitter".length == 7
更新:上述内容只适用于仅包含基本多文种平面(BMP)字符的字符串。
当字符串中包含来自BMP之外的字符(如Emoji)或组合标记时,确定字符串长度就不那么简单了。以下博客文章详细讨论了此问题,强烈建议阅读:https://mathiasbynens.be/notes/javascript-unicode
U+0000..U+10ff, U+2000..U+200D, U+2010..U+201F, U+2032..U+2037
其他所有内容都被计算为2个字符。
考虑到Javascript将超出U+10000的字符编码为U+D800..U+DFFF范围内的UTF-16代理对(例如"".length == 2
),我想出了以下解决方案
function count_tweet_chars(str){
str = str.normalize('NFC');
var char2 = str.match(/[^\u0000-\u10ff,\u2000-\u200D,\u2010-\u201F,\u2032-\u2037,\uD800-\uDfff]/g) || [];
return str.length + char2.length;
}