计算表情符号的字符长度?
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
作为一个潜在的 javascript 解决方案(如果您不介意添加一个库),Lodash 在他们的 toArray 模块中解决了这个问题。
例如,
_.toArray('12').length; // --> 3
或者,如果您想从字符串中删除几个任意字符,您可以操纵并重新加入数组,例如:
_.toArray("trimToEightGlyphs").splice(0,8).join(''); // --> 'trimToE'
我想在新用户在我的页面注册时验证名称。其中一项检查是字符数限制是否不超过 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
作为一个潜在的 javascript 解决方案(如果您不介意添加一个库),Lodash 在他们的 toArray 模块中解决了这个问题。
例如,
_.toArray('12').length; // --> 3
或者,如果您想从字符串中删除几个任意字符,您可以操纵并重新加入数组,例如:
_.toArray("trimToEightGlyphs").splice(0,8).join(''); // --> 'trimToE'