因此,目前我有一个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)
生成
但是PHP的chr()
只允许您一次输入一个,这意味着我无法生成表情符号。
有人知道通过固定当前代码或使用其他函数来实现此目的的方法吗?
编辑:这样您可以获得更多背景信息,我最初必须使用的字符串是HEX UTF-16
005400680069007300200069007300200061002000740065007300740020007700690074006800200061006E00200065006D006F006A00690020D83DDE020020
答案 0 :(得分:0)
我设法使它以这种方式工作
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
根据原始示例/问题,需要将其从当前UTF-16整数数组转换为十六进制字符串