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

Count character length of emoji?

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

但是因为像 ‍❤️‍‍ 这样的单个表情符号(它们实际上是 4 个表情符号在一起?看截图)比 1 个字符要多得多,所以我在验证名称时遇到了问题。我 想要 允许在名字中使用表情符号,因为现在有一颗心、星星或类似的东西很常见,但我不想允许超过 100 个字符的名字.

所以我有这个问题:

PS:我说的是 php 解决方案,但我也可以接受 Javascript,即使我不喜欢它。

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

请注意本题提到的截图:

.

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

如果您需要以字素单位获取长度(而不是字符,就像 mb_strlen 那样),您可以使用 grapheme_strlen:

$emoji = "\u{1F469}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}";
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

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

例如,

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

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

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