如何使用PHP将所有字符转换为等效的html实体

Ash*_*Ash 15 php string encode utf-8 html-entities

我想把它转换hello@domain.com

hello@domain.com
Run Code Online (Sandbox Code Playgroud)

我试过了:

url_encode($string)
Run Code Online (Sandbox Code Playgroud)

这提供了我输入的相同字符串,返回@符号转换为 %40

还尝试过:

htmlentities($string)
Run Code Online (Sandbox Code Playgroud)

这提供了相同的字符串.

我使用的是UTF8字符集.不确定这是否有所作为....

Art*_*cto 40

它在这里(假设UTF-8,但改变是微不足道的):

function encode($str) {
    $str = mb_convert_encoding($str , 'UTF-32', 'UTF-8'); //big endian
    $split = str_split($str, 4);

    $res = "";
    foreach ($split as $c) {
        $cur = 0;
        for ($i = 0; $i < 4; $i++) {
            $cur |= ord($c[$i]) << (8*(3 - $i));
        }
        $res .= "&#" . $cur . ";";
    }
    return $res;
}
Run Code Online (Sandbox Code Playgroud)

编辑推荐的替代品使用unpack:

function encode2($str) {
    $str = mb_convert_encoding($str , 'UTF-32', 'UTF-8');
    $t = unpack("N*", $str);
    $t = array_map(function($n) { return "&#$n;"; }, $t);
    return implode("", $t);
}
Run Code Online (Sandbox Code Playgroud)


Sil*_*eNT 9

更简单的方法:

function convertToNumericEntities($string) {
    $convmap = array(0x80, 0x10ffff, 0, 0xffffff);
    return mb_encode_numericentity($string, $convmap, "UTF-8");
}
Run Code Online (Sandbox Code Playgroud)

如果您使用的是其他任何内容,则可以更改编码.

  • 固定地图范围.感谢Artefacto.