获取Twitter字符计数

3

我有一个程序,它是一款Twitter推文编辑器,它会计算文字数量以确保不超过280个字符的限制。

为此,我使用了utf8属性,就像这样:

var str = "℞"
let r = str.utf8.count

结果 = 3

这个符号(℞)和类似的符号在 Twitter 计数器中只占用了2个字符,但是在这段代码中的结果却是3,因此我无法给用户提供准确的字符计数!

我该如何获取正确的计数:2

1个回答

3

计数字符

推文长度是使用文本的 NFC 规范化版本中的代码点数量来测量的。

在 Swift 中,您可以通过 precomposedStringWithCanonicalMapping 获取 NFC 规范化形式,并通过 unicodeScalars.count 获取代码点数量。

因此,在 Swift 中,正确的代码应该像这样:

var str = "℞"
let r = str.precomposedStringWithCanonicalMapping.unicodeScalars.count
print(r) //->1

上面的代码与网络上的某些字符计数器一致,我不明白为什么你会得到2作为 的结果。
(感谢 Rakesha Shastri。) 我相信上面的代码正确地实现了我链接的文档中描述的规范。
但是据报道,实际的 Twitter 并不完全按照文档中的方式工作。(抱歉,我自己不使用 Twitter。)我们可能需要猜测或找到另一个可靠的来源来使它适应实际的 Twitter。
我尝试了官方库text Tweet parsing library,但它显示与我的代码相同的结果。
let len = TwitterText.tweetLength(str)
print(len) //->1

尽管 TwitterText.tweetLength(_:) 的代码要复杂得多,因为它处理 t.co链接。 因此,当文本中包含某些URL时,它会生成不同于我的代码的输出。
更新: 我不确定所提到的 Twitter 应用程序是否是开源的,但我猜它们显示了上面链接的文本推文解析库中描述的加权长度
你可能需要像这样编写一些内容,并使用pod导入库。
let config = TwitterTextConfiguration(fromJSONResource: kTwitterTextParserConfigurationV2)
let parser = TwitterTextParser(configuration: config)
let result = parser.parseTweet(str)
print(result.weightedLength) //->2

我读了同样的文档,认为这是解决方案。但是如果你去 Twitter 并输入该字符,它会将其计为 2,而不是 1。 - Rakesha Shastri
这个符号在 iPhone 的 Twitter 应用程序和 Tweetbot 应用程序中占用了 2 个字符!! - Nayef
@user2713544,谢谢。自从Rakesha Shastri告诉我实际Twitter显示你的示例为2以来,我一直在网上徘徊。但是很抱歉,到目前为止我还没有找到任何线索。 - OOPer
你说得对,Twitter的文档是错的。他们声称计算的是Unicode码点,但实际上计算的是UTF-16码元。(顺便说一下,这也是JavaScript和C#中测量字符串长度的方式;我猜测在他们的后端中,他们使用了以UTF-16码元为单位测量字符串长度的语言,并且编写文档的人不知道这与Unicode码点不同。)我不是Swift开发人员,所以不确定如何在Swift中最好地测量字符串的UTF-16码元长度。这一部分就留给你了。 - Mark Amery
1
顺便说一句,由于我找不到官方报告错误的方式,我注册了一个 Twitter 帐户,并在 @TwitterSupport 上发布了关于此文档错误的推文:https://twitter.com/XplodingCabbage/status/1074355570512142336。我们将看看是否会有任何进展。 - Mark Amery
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接