兑换 ? ?使用 PHP 到 HTML 中的表情符号

Convert � � to Emoji in HTML using PHP

我们有一堆代理对(或 2 字节 utf8?)字符,例如 ��,这是作为 2 个字符存储为 UTF8 的祈祷之手表情符号。在浏览器中呈现时,此字符串呈现为两个 ??

示例:????

我需要使用 php 将它们转换为 emjoi 手,但我根本找不到 iconv、utf8_decode、html_entity_decode 等的组合来实现它。

此站点正确转换 ��

http://www.convertstring.com/EncodeDecode/HtmlDecode

在其中粘贴以下字符串

Please join me in this prayer. ��❤️

您会注意到代理对???? (��) 转换为

此站点声称使用 HTMLDecode,但我在 php 中找不到任何内容来实现此目的。我努力了: 图标 html_entity_decode 和一些 public 个图书馆。

我承认在转换字符编码方面我不是专家!

我找不到执行此操作的函数,但这个有效:

$str = "Please join me in this prayer. ��❤️";
$newStr = preg_replace_callback("/&#.....;&#.....;/", function($matches){return convertToEmoji($matches);}, $str);
print_r($newStr);
function convertToEmoji($matches){
    $newStr = $matches[0];
    $newStr = str_replace("&#", '', $newStr);
    $newStr = str_replace(";", '##', $newStr);
    $myEmoji = explode("##", $newStr);
    $newStr = dechex($myEmoji[0]) . dechex($myEmoji[1]);
    $newStr = hex2bin($newStr);
    return iconv("UTF-16BE", "UTF-8", $newStr);
}

我想花点时间清理一下 TylerF 的工作代码。

代码:(3v4l.org Demo)

$str = "Please join me in this prayer. ��❤️";
echo preg_replace_callback(
         "/&#(\d{5});&#(\d{5});/",
         function($m) {
             return iconv("UTF-16BE", "UTF-8", hex2bin(dechex($m[1]) . dechex($m[2])));
         },
         $str
     );

原始输出:

Please join me in this prayer. ❤️

当前输出:

Warning: iconv(): Wrong encoding, conversion from "UTF-16BE" to "UTF-8" is not allowed
  • 改点为数字字符匹配,采用捕获组简化后续流程。
  • 自定义函数中不再有 str_replace()explode() 调用。
  • 没有一次性变量声明。

与 PHP7.4 箭头函数语法 (Sandbox demo that actually works) 相同的技术:

$str = "Please join me in this prayer. ��❤️";
var_export(
    preg_replace_callback(
        "/&#(\d{5});&#(\d{5});/",
        fn($m) => iconv("UTF-16BE", "UTF-8", hex2bin(dechex($m[1]) . dechex($m[2]))),
        $str
    )
);