PHP将表情符号从UTF-8转换为UTF-8字节(UTF-16)

时间:2018-02-16 08:03:55

标签: php utf-8 emoji utf-16

所以我需要这个:\ ud83d \ ude01变成这个:\ xF0 \ x9F \ x98 \ x81 我一直在挖掘,为了我的生活,我无法弄清楚如何做到这一点。 有人可以帮帮我吗? 提前谢谢。

1 个答案:

答案 0 :(得分:2)

对于16位Unicode字符,

\ud83d\ude01escape sequence,你显然想要的是一个8位字符转义序列(使用十六进制数字)。

正如已经指出的那样,你可以使用json_decode()从你的unicode转义序列中获取实际的表情符号:

$str = "\ud83d\ude01";
$str = json_decode('"' . $str . '"');
echo $str;    // 

然后,您可以使用str_split()来获取数组中表情符号的每个字节,如文档中所述:

  在处理多字节编码字符串时,

str_split()将拆分为字节,而不是字符。

要将每个字节转换为十六进制表示,请使用ord()dechex()

$bytes = str_split($str);
for ($i = 0; $i < count($bytes); $i++) {
    $bytes[$i] = "\x" . dechex(ord($bytes[$i]));
}
$str = implode('',$bytes);

请注意,您需要自己在每个十六进制数字前添加\x以获得所需的序列。

一切都放在一起:

$str = "\ud83d\ude01";
$str = json_decode('"' . $str . '"');
$bytes = str_split($str);
for ($i = 0; $i < count($bytes); $i++) {
    $bytes[$i] = "\x" . dechex(ord($bytes[$i]));
}
$str = implode('',$bytes);

echo $str;    // \xf0\x9f\x98\x81

https://3v4l.org/A1PEn