使用十进制 UTF-16 打印表情符号 php

Print emoji using UTF-16 decimal php

所以目前我有一个 UTF-16 十进制字符串,我正在使用 chr() 进行转换。

大部分情况下它工作正常,但它在表情符号上失败了。

我运行 js中的一个完美运行的例子,这是那个例子

console.log(String.fromCharCode(84,104,105,115,32,105,115,32,97,32,116,101,115,116,32,119,105,116,104,32,97,110,32,101,109,111,106,105,32,55357,56834,32))

产生

This is a test with an emoji  

但是当我尝试在 PHP 中执行此操作时,这就是我得到的结果

function fromCharCode() {
    return array_reduce(func_get_args(),function($a,$b){$a.=chr($b);return $a;});
}
print(fromCharCode(84,104,105,115,32,105,115,32,97,32,116,101,115,116,32,119,105,116,104,32,97,110,32,101,109,111,106,105,32,55357,56834,32));

结果:

This is a test with an emoji =

现在我发现 js 让我接受 String.fromCharCode(55357,56834) 产生 </code></p> <p>但是PHP的<code>chr()一次只能收一个,这意味着我无法制作表情符号。

有谁知道通过修复当前代码或使用不同函数来完成此操作的方法吗?

编辑:所以你得到了更多背景知识,我最初必须开始的字符串是 HEX UTF-16 005400680069007300200069007300200061002000740065007300740020007700690074006800200061006E00200065006D006F006A00690020D83DDE020020

我设法让它以这种方式工作

echo utf16HexToUtf8("005400680069007300200069007300200061002000740065007300740020007700690074006800200061006E00200065006D006F006A00690020D83DDE020020");

function utf16HexToUtf8($data){
    return preg_replace_callback('/(d[89ab][0-9a-f]{2})(d[c-f][0-9a-f]{2})|([0-9a-fA-F]{4})/i', function ($matches) {
        return mb_convert_encoding( hex2bin($matches[0]), 'UTF-8', 'UTF-16');
    }, $data);
}

输出:

This is a test with an emoji 

它将它从一个大的长十六进制字符串转换为二进制,然后将它从 UTF-16 转换为 UTF-8

根据原始 example/question,需要将其从当前的 UTF-16 整数数组转换为 HEX 字符串