计算表情符号的字符长度?
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 个表情符号返回错误的长度