替代使用 HTML 实体字符集的mb_convert_encoding


Alternative to mb_convert_encoding with HTML-ENTITIES charset

我有以下代码:

mb_convert_encoding($string, 'HTML-ENTITIES', 'utf-8');

我需要有一个替代代码,它执行完全相同的操作,但不使用任何mb_*函数(mb扩展名在某些环境中不可用)。

我以为

utf8_decode(htmlentities($string, ENT_COMPAT, 'utf-8'));

应该做完全相同的事情,但不幸的是它没有。

我玩了一会儿,发现这很有趣。似乎第二部分也运行"htmlspecialchars"。一定是mb_convert_encoding中的一些错误,因为html实体无法正常运行。

如果你对结果运行htmlspecialchars_decode,你会得到与使用mb_convert_encoding完全相同的结果。

代码:

$string = 'Test:!"$%&/()=ÖÄÜöäü<<';
echo mb_convert_encoding($string, 'HTML-ENTITIES', 'utf-8')."'n'n";
echo htmlspecialchars_decode(utf8_decode(htmlentities($string, ENT_COMPAT, 'utf-8', false)));

下面是上面代码的演示:http://sandbox.onlinephpfunctions.com/code/715acade3b8337d9c9e48e58deee2a237015c259

这里有一个没有htmlspecialchars_decode的演示,以展示您的问题:http://sandbox.onlinephpfunctions.com/code/5c4a32bf99aa8fd6246c4a77132a023d32945363

解决方案

"htmlspecialchars_decode(utf8_decode(htmlentities($string, ENT_COMPAT, 'utf-8', false)));" 没有好的结果,这里有另一个解决方案:

    $string = 'Test:!"$%&/()=ÖÄÜöäü<<accentué За матеріалами';
    echo mb_convert_encoding($string, 'HTML-ENTITIES', 'utf-8')."'n'n";
    echo mb_encode_numericentity(
        htmlspecialchars_decode(
            htmlentities($string, ENT_NOQUOTES, 'UTF-8', false)
            ,ENT_NOQUOTES
        ), [0x80, 0x10FFFF, 0, ~0],
        'UTF-8'
    );

这里有一个演示:https://onlinephp.io/c/0a300