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

时间:2014-04-09 12:55:12

标签: 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字符集)。但仍然没有快乐。

1 个答案:

答案 0 :(得分:2)

首先,我们让条款正确:

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