background image

PHP 自动识别字符集并完成转码详解

直接上函数,这个函数是用来对字符串进行检查和转码的。需要的朋友可以过来参考下
因为自己使用字符编码一般的是

utf-8 编码,但如果对方的博客使用 gb2312 编码的话,

POST 过来就会出现乱码(除非对方 POST 前先转换编码)。在不能保证对方是否一定使用
utf-8 编码的情况下,自己做一个编码的检查和转换是很有必要的。
写了个函数来完成这个工作,原理很简单,因为

gb2312/gbk 是中文两字节,这两个字节是

有取值范围的,而

utf-8 中汉字是三字节,同样每个字节也有取值范围。而英文不管在何种

编码情况下,都是小于

128,只占用一个字节(全角除外)。

如果是文件形式的编码检查,还可以直接

check utf-8 的 BOM 信息,关于这方面的东西,

大家可以看看

TP 工具箱的编码转换功能,我在那个 AppCodingSwitch 类中写了比较详细的

注释。
话不多说,直接上函数,这个函数是用来对字符串进行检查和转码的。文件的检查与转码
代码如下

:

 

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) {

            

//第一个字节判断通过 

            

$char

 = 

$string

{++

$i

};

            

if

 ((ord(

$char

) & 128) == 128) {

                

//第二个字节判断通过 

                

$encoding

 = "GB2312";

                

break

;

            

}

        

}