PHP表情符号转Unicode无法适当地转换多个表情符号

3

这个函数将表情符号转换为 Unicode 编码。

function emoji_to_unicode($emoji) {
   $emoji = mb_convert_encoding($emoji, 'UTF-32', 'UTF-8');
   $unicode = strtoupper(preg_replace("/^[0]+/","U+",bin2hex($emoji)));
   return $unicode;
}

用法

$var = ("");
echo  emoji_to_unicode($var);

所以它会返回给我U+1F600,问题在于如果我在$var中添加更多表情符号,它只会返回第一个表情符号,下面是返回的示例:

$var = ("");
echo  emoji_to_unicode($var);

当转换单个表情符号时,它可以正常工作,但在转换多个表情符号时,返回给我的是U+1F6000001F600,而不是应该返回的U+1F600 U+1F600


这是函数的作用:转换一个表情符号。它明确地被编写为这个目的。如果你需要一个可以处理多个表情符号的函数,你应该重写你的代码。 - KIKO Software
2个回答

3

一种方法是遍历$var中的每个字符,并在进行转换时进行。请注意,为了使函数更加稳健,您应该只替换前3个零(以避免混乱例如以4开头的值),这样函数将适用于所有字符。我还添加了一个检查(使用mb_ord)来确认字符需要转换,以便它也可以用于普通文本:

function emoji_to_unicode($emoji) {
    if (mb_ord($emoji) < 256) return $emoji;
    $emoji = mb_convert_encoding($emoji, 'UTF-32', 'UTF-8');
    $unicode = strtoupper(preg_replace("/^[0]{3}/","U+",bin2hex($emoji)));
    return $unicode;
}


$var = ("xhello");
$out = '';
for ($i = 0; $i < mb_strlen($var); $i++) {
    $out .= emoji_to_unicode(mb_substr($var, $i, 1));
}
echo "$out\n";

输出:

U+1F600xU+1F600hello

在3v4l.org上的演示


如果我的文本中包含表情符号,如何避免将其转换? - Otávio Barreto
我明白了,但文本也作为十六进制返回,我想保留表情符号,但将文本作为纯文本字符串返回。 - Otávio Barreto
我不确定,也许使用 preg_replace_callbackmb_ord 可以返回 Unicode 表示的表情符号,并保留文本的纯文本格式 https://www.php.net/manual/en/function.preg-replace-callback.php。如果您找到了解决方案,请更新。 - Otávio Barreto
@OtávioBarreto 请查看我的编辑。那应该可以实现你想要的功能。抱歉回复较慢,这里是夜晚时间... - Nick
感谢您提供的解决方案,这已经接近于机器级别的编程了。我们让复杂的事情看起来变得如此简单,非常感谢您。 - Otávio Barreto
我该如何在函数内部添加for循环,以便函数本身就可以运行for循环? - Otávio Barreto

2
function emoji_to_unicode($emoji) {
   $emoji = mb_convert_encoding($emoji, 'UTF-32', 'UTF-8');
   $unicode = strtoupper(preg_replace("/0{3}1/"," U+1",bin2hex($emoji)));
  return $unicode;
}

$var = ("");
echo  emoji_to_unicode($var); // U+1F600 U+1F600

$var = ("");
echo  emoji_to_unicode($var); // U+1F600 U+1F600 U+1F600

如果我的文本中包含表情符号,该如何避免其被转换? - Otávio Barreto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接