计算表情符号的字符长度?

Posted

技术标签:

【中文标题】计算表情符号的字符长度?【英文标题】:Count character length of emoji? 【发布时间】:2017-03-14 17:53:40 【问题描述】:

我想在新用户在我的页面上注册时验证名称。其中一项检查是字符限制是否不超过 100。

但既然只有一个表情符号像??????‍❤️‍??????‍???? (实际上是 4 个表情符号在一起?见屏幕截图)超过 1 个字符 我在验证名称时遇到问题。我想要在名称中允许使用表情符号,因为现在有心形、星形或类似的东西在其中很常见,但我不想允许超过 100 个字符的名称。

所以我有这个问题:

如何将一个表情符号算作所有表情符号中的一个字符(如果可能的话)?

PS:我说的是 php 解决方案,但我也愿意接受 javascript,即使我不喜欢它。

编辑:我的示例表情符号似乎是这个字符串:\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69

请注意上面提到的这个问题的截图:

.

【问题讨论】:

PHP 警告意味着您将数组传递给trim,而不是字符串。这是您代码中的错误,PHP 没有问题,也与 emoji 无关。 哦,你是对的。我发现了那个错误并编辑了我的问题。谢谢。 @deceze 不管怎样,这个表情符号由 8 个 Unicode 标量值序列组成:U+1F469 WOMAN; U+200D 零宽度连接器; U+2764 重黑色心脏; U+FE0F 变化选择器-16; U+200D 零宽度连接器; U+1F48B 吻痕; U+200D 零宽度连接器; U+1F469 女人。一些编程语言会将 WOMAN 和 KISS MARK 视为两个字符,因为这些字符需要两个 UTF-16 代码单元来表示。 基本上......是否????‍❤️‍??????‍????是一个还是四个表情符号取决于显示它的系统是否知道可能的组合。 grapheme_strlen 将其计为一个字符:3v4l.org/0cVF1 【参考方案1】:

作为一个潜在的 javascript 解决方案(如果您不介意添加一个库),Lodash 在他们的 toArray 模块中解决了这个问题。

例如,

_.toArray('12?').length; // --> 3

或者,如果您想从字符串中剔除几个任意字符,您可以操作并重新加入数组,例如:

_.toArray("?trimToEightGlyphs").splice(0,8).join(''); // --> '?trimToE'

【讨论】:

【参考方案2】:

Unicode 将抽象字符定义为代码点,但允许在屏幕上呈现它的是字体。字体是图形形状的集合,称为字形,它们是代码点或代码点序列的视觉表示。显示为单个图形单元的一个或多个代码点序列称为grapheme

如果您需要以字形单位获取长度(而不是字符,例如 mb_strlen 会这样做),您可以使用 grapheme_strlen

$emoji = "\u1F469\u200D\u2764\uFE0F\u200D\u1F48B\u200D\u1F469";
echo $emoji , " : " , strlen($emoji) , "\n"; // 27, count bytes
echo $emoji , " : " , mb_strlen($emoji) , "\n"; // 8, count characters
echo $emoji , " : " , grapheme_strlen($emoji) , "\n"; // 1, count grapheme units

https://3v4l.org/KSSl4

【讨论】:

谢谢!我只是想请您将其发布为答案。可能只有我的服务器提供商没有安装intl 的问题,就像我的 xampp 版本默认也没有安装一样。在这种情况下是否有使用“旧”功能的解决方法? 试试 symfony 的 polyfill,github.com/symfony/polyfill-intl-grapheme/blob/master/…

以上是关于计算表情符号的字符长度?的主要内容,如果未能解决你的问题,请参考以下文章

与包含它们的字符集进行比较时,只有 2 个表情符号返回错误的长度

如何将包含表情符号的字符串拆分为数组?

带有肤色的表情符号如何在内部表示? [关闭]

如何清除填充表情符号字符的字体缓存?

用SQL计算同一个字符(汉字、字母、数字、表情、符号)连续重复出现的次数

苹果emoji表情符号 那种特殊的符号怎么打出来