PHP表情符号到unicode不能正确转换多个表情符号

标签 php function unicode emoji

此函数将表情符号转换为 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+1F600 U+1F600 时返回给我 U+1F6000001F600

转换单个表情符号时可以正常工作,但转换多个表情符号时不起作用

最佳答案

实现此目的的一种方法是遍历 $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 = ("😀x😀hello");
$out = '';
for ($i = 0; $i < mb_strlen($var); $i++) {
    $out .= emoji_to_unicode(mb_substr($var, $i, 1));
}
echo "$out\n";

输出:

U+1F600xU+1F600hello

Demo on 3v4l.org

关于PHP表情符号到unicode不能正确转换多个表情符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57447564/

相关文章:

javascript - 这个奇怪的 setTimeout 语法是什么?

java - 如何在android中将Unicode字符串转换为文本

python - 在python中从十六进制字符转换为Unicode字符

c++ - 试图从类中调用函数

c++ - 为什么 C++ 对函数原型(prototype)(签名)的前向声明更加严格?

unicode - 如何在网页上使用Unicode符号?

php - Laravel 5.2 使用 Associate 更新 BelongsTo 关系

PHP 配置模块安全注意事项

javascript - 如何正确格式化 JSON

php - 良好的数字哈希