【问题标题】:Count tweet length like twitter with PHP用 PHP 计算推文长度,如推特
【发布时间】:2020-01-26 07:17:29
【问题描述】:

我想像推特一样计算推文长度,我尝试使用mb_strlenstrlen所有这些类型here

问题是 twitter 计数 "????????✌????️ @mention"15,但我得到了这些结果,但我不知道 twitter 表情符号是如何计数的,以及如何使用 php 来解决这个问题

我的结果:

strlen: 27
mb_strlen UTF-8: 14
mb_strlen UTF-16: 13
iconv UTF-16: 14
iconv UTF-16: 27

【问题讨论】:

  • twitter 如何计算字符是有据可查的信息。 developer.twitter.com/en/docs/basics/counting-characters
  • @Sherif 我读了不止一次,根据这个文档,我使用 Normalization 和 mb_strlen 和 UTF-8,仍然得到错误的值(例如 14 而不是 15)
  • 好的,我在下面发布了更详细的答案,但老实说,这些文档回答了您需要了解的有关 twitter 方法的所有信息。
  • 你在推特上将"????????✌????️ @mention" 计数为 15 的来源是什么?
  • @WebSmithery twitter.com

标签: php


【解决方案1】:

来自Twitter's developer documentation

对于具有 Unicode 处理经验的程序员来说,这个问题的简短回答是推文长度是通过文本的 NFC 规范化版本中的代码点的数量来衡量的。

因此,要在 PHP 中计算推文的长度,您将首先使用 Normalization Form C (NFC) 对文本进行规范化,然后计算 codepoints 的数量(NOT CHARACTERS)在规范化文本中。

$text = "??✌?️ @mention";

// Get the normalized text in UTF-8
$NormalizedText = Normalizer::normalize($text, Normalizer::FORM_C );

// Now we can calculate the number of codepoints in this normalized text
$it = IntlBreakIterator::createCodePointInstance();
$it->setText($NormalizedText);

$len = 0;
foreach ($it as $codePoint) {
    $len++;
}

echo "Length = $len"; // Result: Length = 15

【讨论】:

  • 谢谢,我使用规范化但计数字符,再次感谢它的工作
  • 关闭,但减 1。迭代器返回断点,从第一个字符左侧的 0 开始。因此,如果给定“ABC”,它将返回 0、1、2、3。您可以删除 $len,长度只是返回的最后一个 $codepoint。 “遍历 IntlBreakIterator 产生非负整数值,表示文本边界的连续位置,表示为 UTF-8 代码单元(字节)计数,取自文本的开头(位置为 0)。产生的键由迭代器简单地形成自然数序列 {0, 1, 2, ...}。"
  • 这是非常不正确的。根据 Twitter 文档,您链接到“表情符号始终算作两个字符,无论组合修饰符如何”。您的代码没有考虑到这一点。他们给出的一个例子是?‍?‍?‍?的长度为2。你的方法说8。
  • 你没有错。他们确实忽略了连接字形。如果您对此有更好的解决方案,请随时进行编辑。
猜你喜欢
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 2012-11-24
  • 2016-02-01
  • 1970-01-01
  • 2020-04-08
  • 2020-11-16
  • 1970-01-01
相关资源
最近更新 更多