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

时间:2016-11-01 14:57:30

标签: javascript php validation emoji

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

但是,因为像❤️这样的单个表情符号(那些实际上是4个表情符号在一起?看截图)数不止1个字符我有问题来验证名称。我允许表情符号中的表情符号,因为这些日子里有一颗心,星星或类似的东西很常见,但我不想让名字更多超过100个字符。

所以我有这个问题:

  • 如何将一个表情符号统计为所有表情符号的一个字符(如果它甚至可能)?

PS:我正在谈论一个php解决方案,但我也会接受Javascript,即使我不喜欢它。

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

请注意这个问题的屏幕截图:

The screenshot of this question, please notice the emoji output

2 个答案:

答案 0 :(得分:10)

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

例如,

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

或者,如果你想从字符串中敲掉几个任意字符,你就可以操作并重新加入数组,如:

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

答案 1 :(得分:8)

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