天天看点

PHP判断字符集并转码的函数

原理很简单,因为gb2312/gbk是中文两字节,这两个字节是有取值范围的,而utf-8中汉字是三字节,同样每个字节也有取值范围。而英文不 管在何种编码情况下,都是小于128,只占用一个字节(全角除外)。

如果是文件形式的编码检查,还可以直接check utf-8的bom信息。话不多说,直接上函数,这个函数是用来对字符串进行检查和转码的。

PHP判断字符集并转码的函数

<?php  

function safeencoding($string,$outencoding ='utf-8')      

{      

    $encoding = "utf-8";      

    for($i=0;$i<strlen($string);$i++)      

    {      

        if(ord($string{$i})<128)      

            continue;      

        if((ord($string{$i})&224)==224)      

        {      

            //第一个字节判断通过      

            $char = $string{++$i};      

            if((ord($char)&128)==128)      

            {      

                //第二个字节判断通过      

                $char = $string{++$i};      

                if((ord($char)&128)==128)      

                {      

                    $encoding = "utf-8";      

                    break;      

                }      

            }      

        }      

        if((ord($string{$i})&192)==192)      

                // 第二个字节判断通过      

                $encoding = "gb2312";      

                break;      

    }      

    if(strtoupper($encoding) == strtoupper($outencoding))      

        return $string;      

    else     

        return iconv($encoding,$outencoding,$string);      

}  

?>  

PHP判断字符集并转码的函数

/** 

 * 将未知编码的字符串转换为期望的编码(配置文件中设置的编码) 

 * @param unknown $str 

 * @param string $toencoding 

 * @return string 

 */  

function convertstr($str, $toencode = 'utf-8') {  

    $charsetlist = array('ascii', 'gbk', 'gb2312', 'utf-8', 'big5');  

    $strcode = mb_detect_encoding($str, $charsetlist);  

    if (strtolower($strcode) != strtolower($toencode)) {  

        $str = iconv($strcode, $toencode, $str);  

    }  

    return $str;  

}