如何在PHP中将Unicode表情符号转换为Emoji?

28

我使用这个Emoji表格,并尝试了这段代码:

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

如果我尝试通过json_decode将这个\u1F600(露齿而笑的脸)转换,我会看到这个符号 — ὠ0

怎么回事?如何得到正确的表情符号?


2
你尝试过使用字节符号表示法吗?echo "\xF0\x9F\x98\x80"; 或许你的浏览器无法显示这个? - bobble bubble
如果您将PHP文件保存在正确的编码中,您也可以只写print(''); - roeland
如果您的问题与如何将它们保存在数据库中有关,如果您使用的是MySQL,则可以将字符集更改为utfbm4。请参阅此处 - Juan Antonio
3个回答

57

PHP 5

JSON的\u一次只能处理一个UTF-16代码单元,因此您需要编写代理对。 对于U+1F600,这是\uD83D\uDE00,可以正常工作:

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

PHP 7

现在您不再需要使用json_decode函数,只需使用\u和Unicode字面量即可:

echo "\u{1F30F}";


7

除了Tino的答案之外,我想添加代码来将类似于0x1F63C的十六进制代码转换为在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); 的输出结果为


0

解析包含表情符号Unicode格式的字符串代码示例

$str = 'Test emoji \U0001F607 \U0001F63C';

echo preg_replace_callback(
    '/\\\U([A-F0-9]+)/',
    function ($matches) {
        return mb_convert_encoding(hex2bin($matches[1]), 'UTF-8', 'UTF-32');
    },
    $str
);

输出:测试表情符号

https://3v4l.org/63dUR


1
目前你的回答不够清晰。请编辑并添加更多细节,以帮助其他人理解它如何回答所提出的问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community

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