web-dev-qa-db-ja.com

PHPで絵文字をUnicodeから変換する方法は?

私はこれを使用します 絵文字の表 このコードを試してください:

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

これを変換しようとすると \ u1F6 (笑顔)からjson_decode、この記号が表示されます— ὠ0

どうしましたか?絵文字を正しく取得するには?

20
Platon

PHP 5

JSONの\uは一度に1つのUTF-16コードユニットしか処理できないため、代わりにサロゲートペアを記述する必要があります。 U+1F600 の場合、これは\uD83D\uDE00で、動作します:

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

PHP 7

これでjson_decodeを使用する必要がなくなり、\uとunicodeリテラルのみを使用できます。

echo "\u{1F30F}";
????
37
Tino Didriksen

Tinoの答えに加えて、0x1F63Cのような16進コードをPHP5のUnicodeシンボルに変換するコードを追加して、サロゲートペアに分割します。

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);出力????

5
shukshin.ivan