【问题标题】:How to convert a double byte utf-8 character to utf-16 in PHP如何在 PHP 中将双字节 utf-8 字符转换为 utf-16
【发布时间】:2014-05-22 16:41:21
【问题描述】:

我有以下双字节 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 字符集)。但仍然没有喜悦。

【问题讨论】:

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

标签: php encoding utf-8 character-encoding


【解决方案1】:

首先,让我们正确理解条款:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 2011-09-06
    • 1970-01-01
    • 2010-09-21
    • 2010-11-16
    • 2014-02-22
    • 1970-01-01
    相关资源
    最近更新 更多