编码转换:unicode(10进制,#12345;)转utf8

遇到问题:我需要把好大一坨类似“ &#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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值