表情符号未正确编码为十六进制

Emojis not correctly encode into hexadecimal

$message = "Spanish Language 
á, é, í, ó, ú, ñ, ü
       ";
$hex = '@U' . strtoupper(bin2hex(mb_convert_encoding($message, 'UCS-2','auto')));

当我将 $hex 发送到以下 API 时,除表情符号外,一切都很好,相反,如果表情符号 ? 符号出现在手机中

https://api.txtlocal.com/docs/encodingdecodingunicode

请指正我做错了什么。

这些表情符号无法在 UCS-2 中表示。在 UTF-16 中,它们使用代理对表示,这在 UCS-2 中不受支持。例如,以 UTF-16 编码为:

0x3d 0xd8 0x0b 0xde

这是四个字节,尽管它应该只是一个字符。 UCS-2 保证它包含的所有字符将恰好占用两个字节,因此不包括在内。

我修复了这个问题,只需更改以下代码行

return '@U' . strtoupper(bin2hex(mb_convert_encoding($message, 'UTF-16','UTF-8')));