将表情符号转换为十六进制代码

时间:2016-11-13 15:56:55

标签: php converter emoji

我正在尝试检测我通过的表情符号,例如POST(不需要来源)。

作为一个例子,我正在使用这个表情符号:✊(我希望它可见)

它的代码是content:"|00 10 a4 c5 7c 38|"(我正在使用http://unicode.org/emoji/charts/full-emoji-list.html代码)

现在我用json_encode转换了表情符号,然后得到:U+270A U+1F3FE

这里唯一相同的部分是\u270a\ud83c\udffe270a不等于\ud83c\udffe,即使我将它们一起添加(U+1F3FE

如何使用以下方式从✊到1B83A PHP?

3 个答案:

答案 0 :(得分:5)

使用mb_convert_encoding并从UTF-8转换为UTF-32。然后做一些额外的格式化:

// Strips leading zeros
// And returns str in UPPERCASE letters with a U+ prefix
function format($str) {
    $copy = false;
    $len = strlen($str);
    $res = '';

    for ($i = 0; $i < $len; ++$i) {
        $ch = $str[$i];

        if (!$copy) {
            if ($ch != '0') {
                $copy = true;
            }
            // Prevent format("0") from returning ""
            else if (($i + 1) == $len) {
                $res = '0';
            }
        }

        if ($copy) {
            $res .= $ch;
        }
    }

    return 'U+'.strtoupper($res);
}

function convert_emoji($emoji) {
    // ✊ --> 0000270a0001f3fe
    $emoji = mb_convert_encoding($emoji, 'UTF-32', 'UTF-8');
    $hex = bin2hex($emoji);

    // Split the UTF-32 hex representation into chunks
    $hex_len = strlen($hex) / 8;
    $chunks = array();

    for ($i = 0; $i < $hex_len; ++$i) {
        $tmp = substr($hex, $i * 8, 8);

        // Format each chunk
        $chunks[$i] = format($tmp);
    }

    // Convert chunks array back to a string
    return implode($chunks, ' ');
}

echo convert_emoji('✊'); // U+270A U+1F3FE

答案 1 :(得分:1)

您可以这样做,将表情符号视为正常角色。

$emoji = "✊";

$str = str_replace('"', "", json_encode($emoji, JSON_HEX_APOS));

$myInput = $str;

$myHexString = str_replace('\\u', '', $myInput);
$myBinString = hex2bin($myHexString);

print iconv("UTF-16BE", "UTF-8", $myBinString); 

答案 2 :(得分:1)

简单的功能,受到上述@ d3L答案的启发

function emoji_to_unicode($emoji) {
   $emoji = mb_convert_encoding($emoji, 'UTF-32', 'UTF-8');
   $unicode = strtoupper(preg_replace("/^[0]+/","U+",bin2hex($emoji)));
   return $unicode;
}

例如

emoji_to_unicode("");//returns U+1F4B5