假设我在PHP上有以下字符串:
$str = '🀄️';
或JavaScript上的以下字符串:
var str = '🀄️';
如果我执行
utf8_encode($str)
,结果是\ud83c\udc04\ufe0f
,但是我希望它是1F004
或1f004
或\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。等等。