假设我在PHP上有以下字符串:

$str = '🀄️';

或JavaScript上的以下字符串:
var str = '🀄️';

如果我执行utf8_encode($str),结果是\ud83c\udc04\ufe0f,但是我希望它是1F0041f004\u1f004,以便查找与该字符匹配的图像文件。

我已经进行了许多在线搜索,以寻找一种编码方式,发现在很多地方,相同的术语用于非常不同的事物,看起来我想要的是将字符串“编码”为UTF- 32个代码点,但是我真的不知道该如何命名,我只想使用PHP和/或JavaScript将🀄️转换为1f004

http://www.fileformat.info/info/unicode/char/1f004/index.htm

谢谢。

最佳答案

您要从字节流中获取unicode代码点,因此utf8_encode不会有帮助。我找到了一个实现here

function utf8_to_unicode($c)
{
    $ord0 = ord($c{0}); if ($ord0>=0   && $ord0<=127) return $ord0;
    $ord1 = ord($c{1}); if ($ord0>=192 && $ord0<=223) return ($ord0-192)*64 + ($ord1-128);
    $ord2 = ord($c{2}); if ($ord0>=224 && $ord0<=239) return ($ord0-224)*4096 + ($ord1-128)*64 + ($ord2-128);
    $ord3 = ord($c{3}); if ($ord0>=240 && $ord0<=247) return ($ord0-240)*262144 + ($ord1-128)*4096 + ($ord2-128)*64 + ($ord3-128);
    return false;
}

var_dump( dechex(utf8_to_unicode('🀄️')) ); // string(5) "1f004"

UTF-8与单字节ASCII编码兼容,因此$ord0 = ord($c{0}); if ($ord0>=0 && $ord0<=127) return $ord0;非常容易。大于127的代码点由多字节序列表示。接下来的1,920个字符需要两个字节$ord1 = ord($c{1}); if ($ord0>=192 && $ord0<=223) return ($ord0-192)*64 + ($ord1-128);进行编码。第一个字节的格式必须介于192(11000000)和223(11011111)之间。第二个字节必须是10xxxxxx(即十进制的128到191)。这里表示的第一个代码点是U + 0080,最后一个U + 07FF。

等等。

08-19 08:19