Php 将高位代码点(>;U+;FFFF)编码为HTML实体

Php 将高位代码点(>;U+;FFFF)编码为HTML实体,php,utf-8,html-entities,emoji,Php,Utf 8,Html Entities,Emoji,我有一个输入字符串(URL编码): %F0%9F%98%8E 解码的是表情符号“,自己实现就可以了,很简单:如果我给这个函数传递一个url,它就会变成xyz,这是我能处理的任何想法this@AbdulMannan您可以执行str_替换(“+”,“%20”),运行mb_htmlentities,然后将“%20”转换回“+”。您可以尝试取消urldecode函数(因为这是导致加号转换为空格的原因),但这可能会导致mb_htmlentities出现问题。YMMV:)感谢@timgws删除了url de

我有一个输入字符串(URL编码):

%F0%9F%98%8E


解码的是表情符号“
,自己实现就可以了,很简单:如果我给这个函数传递一个url,它就会变成xyz,这是我能处理的任何想法this@AbdulMannan您可以执行str_替换(“+”,“%20”),运行
mb_htmlentities
,然后将“%20”转换回“+”。您可以尝试取消
urldecode
函数(因为这是导致加号转换为空格的原因),但这可能会导致mb_htmlentities出现问题。YMMV:)感谢@timgws删除了url decode,并修复了此问题。
<?php

function mb_ord($char, $encoding = 'UTF-8') {
    if ($encoding === 'UCS-4BE') {
        list(, $ord) = (strlen($char) === 4) ? @unpack('N', $char) : @unpack('n', $char);
        return $ord;
    } else {
        return mb_ord(mb_convert_encoding($char, 'UCS-4BE', $encoding), 'UCS-4BE');
    }
}

function mb_htmlentities($string, $hex = false, $encoding = 'UTF-8') {
    return preg_replace_callback('/[\x{80}-\x{10FFFF}]/u', function ($match) use ($hex) {
        return sprintf($hex ? '&#x%X;' : '&#%d;', mb_ord($match[0]));
    }, $string);
}


echo mb_htmlentities(urldecode('%F0%9F%98%8E'));