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

3
我有一个双字节的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字符集)。但仍然没有成功。


1
\u... 不是 UTF-8 编码,而 U+... 也不是 UTF-16 编码。前者看起来像字符的 JSON 编码表示形式,后者看起来像正式的 Unicode 代码点。两者都不是 UTF 编码。 - deceze
1个回答

3

首先,让我们搞清楚这些术语:

  • \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'));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接