php转码自己定义的iconv函数

需要使用的时候直接
iconv('utf-8','gbk', $str)
就可以了。

如果不支持iconv,会使用自己定义的iconv函数。

<code>
<?php

if ( !function_exists("iconv") ) {
        function iconv($in_charset, $out_charset, $str) {
                $in_charset = strtoupper($in_charset);
                $out_charset = strtoupper($out_charset);
               
                if ($in_charset == "UTF-8" && $out_charset == "GBK") {
                        return utf82gb($str);
                }
                //"GBK", "UTF-8",
                if ($in_charset == "GBK" && $out_charset == "UTF-8") {
                        return gb2utf8($str);
                }
                return $str;
        }
}

/******************************
//UTF-8 转GB编码
*******************************/
function utf82gb($utfstr)
{
        //if(function_exists('iconv')){ return iconv('utf-8','gbk',$utfstr); }
        global $UC2GBTABLE;
        $okstr = "";
        if(trim($utfstr)=="") return $utfstr;
        if(empty($UC2GBTABLE)){
                $filename = dirname(__FILE__)."/gb2312-utf8.table";
                $fp = fopen($filename,"r");
                while($l = fgets($fp,15))
                {        $UC2GBTABLE[hexdec(substr($l, 7, 6))] = hexdec(substr($l, 0, 6));}
                fclose($fp);
        }
        $okstr = "";
        $ulen = strlen($utfstr);
        for($i=0;$i<$ulen;$i++)
        {
                $c = $utfstr[$i];
                $cb = decbin(ord($utfstr[$i]));
                if(strlen($cb)==8){
                        $csize = strpos(decbin(ord($cb)),"0");
                        for($j=0;$j < $csize;$j++){
                                $i++; $c .= $utfstr[$i];
                        }
                        $c = utf82u($c);
                        if(isset($UC2GBTABLE[$c])){
                                $c = dechex($UC2GBTABLE[$c]+0x8080);
                                $okstr .= chr(hexdec($c[0].$c[1])).chr(hexdec($c[2].$c[3]));
                        }
                        else
                        { $okstr .= "&#".$c.";";}
                }
                else $okstr .= $c;
        }
        $okstr = trim($okstr);
        return $okstr;
}

/*******************************
//GB转UTF-8编码
*******************************/
function gb2utf8($gbstr) {
        //if(function_exists('iconv')){ return iconv('gbk','utf-8',$gbstr); }
        global $CODETABLE;
        if(trim($gbstr)=="") return $gbstr;
        if(empty($CODETABLE)){
                $filename = dirname(__FILE__)."/gb2312-utf8.table";
                $fp = fopen($filename,"r");
                while ($l = fgets($fp,15))
                { $CODETABLE[hexdec(substr($l, 0, 6))] = substr($l, 7, 6); }
                fclose($fp);
        }
        $ret = "";
        $utf8 = "";
        while ($gbstr) {
                if (ord(substr($gbstr, 0, 1)) > 0x80) {
                        $thisW = substr($gbstr, 0, 2);
                        $gbstr = substr($gbstr, 2, strlen($gbstr));
                        $utf8 = "";
                        @$utf8 = u2utf8(hexdec($CODETABLE[hexdec(bin2hex($thisW)) - 0x8080]));
                        if($utf8!=""){
                                for ($i = 0;$i < strlen($utf8);$i += 3)
                                        $ret .= chr(substr($utf8, $i, 3));
                        }
                }
                else
                {
                        $ret .= substr($gbstr, 0, 1);
                        $gbstr = substr($gbstr, 1, strlen($gbstr));
                }
        }
        return $ret;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值