如何在PHP中将双字节utf-8字符转换为utf-16

如何在PHP中将双字节utf-8字符转换为utf-16,php,encoding,utf-8,character-encoding,Php,Encoding,Utf 8,Character Encoding,我有以下双字节utf8字符 \ud83d\ude04 (这是ios表情符号)。 我想转换成utf-16 U+1F604 我该怎么做? 我尝试了以下方法: $utf8_string = "\ud83d\ude04"; $utf16_string = mb_convert_encoding($utf8_string, 'UTF-16', 'UTF-8'); 但是我得到了原始的utf8字符串。它不会被转换 我想我可能需要先解码utf8字符串。我已经尝试过使用json_decode(它可以很好地解

我有以下双字节utf8字符

\ud83d\ude04
(这是ios表情符号)。 我想转换成utf-16

U+1F604
我该怎么做? 我尝试了以下方法:

$utf8_string = "\ud83d\ude04";
$utf16_string = mb_convert_encoding($utf8_string, 'UTF-16', 'UTF-8');
但是我得到了原始的utf8字符串。它不会被转换


我想我可能需要先解码utf8字符串。我已经尝试过使用json_decode(它可以很好地解码utf8字符集)来实现这一点。但是仍然没有乐趣。

首先,让我们把条件弄对:

  • \ud83d\ude04
    是一个Unicode转义序列,例如在Javascript中使用。它不是“UTF-8”
  • 它也不是“双字节”,而是一个代理对
  • U+1F604是Unicode代码点的官方符号。它不是“UTF-16”
第一步是从“\ud83d\ude04”获取UTF-8编码字符串。最简单的方法是:

$utf8 = json_decode('"\ud83d\ude04"'); // note the added "" quotes
要从此处转换为UTF-16编码字符串,只需执行以下操作:

iconv('UTF-8', 'UTF-16', $utf8)
但是,结果不是“U+1F604”,而是UTF-16编码字符串(其十六进制表示形式为
feffd83dde04

要获得Unicode码点表示法,最简单的方法可能是转换为UCS-4并调整前导零:

$ucs4      = iconv('UTF-8', 'UCS-4', $utf8);
$codepoint = sprintf('U+%04s', ltrim(strtoupper(bin2hex($ucs4)), '0'));

\u..
不是UTF-8,
u+…
不是UTF-16。前者看起来像字符的JSON编码表示,后者看起来像正式的Unicode代码点。两者都不是UTF编码。