Как преобразовать Emoji из Unicode в PHP?

Я использую эту таблицу Emoji и пробую этот код:

<?php print json_decode('"\u2600"'); // This convert to ☀ (black sun with rays) ?>

Если я попытаюсь преобразовать этот \u1F600 (улыбающееся лицо) через json_decode, я вижу этот символ - ὠ0.

Что не так? Как правильно выбрать Эможи?

Ответы

Ответ 1

PHP 5

JSON \u может обрабатывать только один модуль кода UTF-16 за раз, поэтому вместо этого вам нужно написать суррогатную пару. Для U+1F600 это \uD83D\uDE00, который работает:

echo json_decode('"\uD83D\uDE00"');
😀

PHP 7

Теперь вам больше не нужно использовать json_decode и можете просто использовать литерал \u и unicode:

echo "\u{1F30F}";
🌏

Ответ 2

В дополнение к ответу Tino я хотел бы добавить код для преобразования шестнадцатеричного кода, например 0x1F63C, в символ unicode в PHP5, разделив его на суррогатную пару:

function codeToSymbol($em) {
    if($em > 0x10000) {
        $first = (($em - 0x10000) >> 10) + 0xD800;
        $second = (($em - 0x10000) % 0x400) + 0xDC00;
        return json_decode('"' . sprintf("\\u%X\\u%X", $first, $second) . '"');
    } else {
        return json_decode('"' . sprintf("\\u%X", $em) . '"');
    }
}

echo codeToSymbol(0x1F63C); выходы 😼