【问题标题】: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

标签: javascript php validation emoji


【解决方案1】:

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

例如,

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

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

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

【讨论】:

    【解决方案2】:

    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

    【讨论】:

    • 谢谢!我只是想请您将其发布为答案。可能只有我的服务器提供商没有安装intl 的问题,就像我的 xampp 版本默认也没有安装一样。在这种情况下是否有使用“旧”功能的解决方法?
    猜你喜欢
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 2021-12-03
    • 2015-01-16
    • 2019-05-09
    相关资源
    最近更新 更多