遇到问题:我需要把好大一坨类似“ &#20961 ;&#23458 ; ”这样的东西转化成可读的utf8编码。
例如 &#23458 ; 代表「客」这个字

一步一步探索:

  • 网上找了很多代码来试验,都以失败告终
  • 直接google搜索 &#23458 ; 变成了google 搜索 「客」这个关键字了
  • 重新google后得知,该类型编码为html页面中可以正常显示为汉字的unicode的10进制表示形式
  • 再次搜索,发现前辈的文章:http://blog.csdn.net/linvo/article/details/6221913, 里面提到

再次翻手册,在utf8_encode函数的评论中看到了一个有用的回复,试验成功!(PS:带评论的手册真他喵的好用~)

直接copy博主的函数使用,发现失败。最后跑到博主提到的 utf8_encode 官方文档里面去找评论,找到博主说的这个评论,发现博主粘贴的时候估计格式变了,导致不能使用,下面附上正确的转换函数。

php    function html_to_utf8 ($data)
        {
            $data=htmlspecialchars_decode(htmlspecialchars_decode($data));
        return preg_replace("/\\&\\#([0-9]{3,10})\\;/e", '_html_to_utf8("\\1")', $data);
        }

    function _html_to_utf8($data) {
        if ($data > 127) {
            $i = 5;
            while ( ($i --) > 0 ) {
                if ($data != ($a = $data % ($p = pow ( 64, $i )))) {
                    $ret = chr ( base_convert ( str_pad ( str_repeat ( 1, $i + 1 ), 8, "0" ), 2, 10 ) + (($data - $a) / $p) );
                    for($i; $i > 0; $i --)
                        $ret .= chr ( 128 + ((($data % pow ( 64, $i )) - ($data % ($p = pow ( 64, $i - 1 )))) / $p) );
                    break;
                }
            }
        } else
            $ret = "&#$data;";
        return $ret;
    }

Tim_Pan
222 声望5 粉丝

当被琐事压的喘不过气,静静地写行代码,解个谜题,这个世界仿佛又重新属于我