首頁 >後端開發 >php教程 >php 字元編碼轉換類別的相關內容

php 字元編碼轉換類別的相關內容

jacklove
jacklove原創
2018-06-09 11:10:332267瀏覽

php 字元編碼轉換類,支援ANSI、Unicode、Unicode big endian、UTF-8、UTF-8 Bom 互相轉換。

四種共同文字檔案編碼方式

#ANSI編碼

無檔案頭(檔案編碼開頭標誌性位元組)

#ANSI編碼字母數字佔一個位元組,漢字佔兩個位元組

回車換行符,單字節, 十六進位表示為0d  0a

UNICODE編碼:

檔頭,十六進位表示為FF FE

#每個字元都用兩個位元組編碼

#回車換行符, 雙字節,十六進位表示為000d  000a

#Unicode big endian編碼:

檔案頭十六進位表示為FE FF

後面編碼是把字元的高位元放在前面,低位放在後面,剛好和Unicode編碼顛倒

回車換行符,雙位元組,十六進位表示為0d00  0a00

UTF-8 編碼:

檔案頭,十六進位表示為EF BB BF

UTF-8是Unicode的一種變長字元編碼,數字、字母、回車、換行都用一個位元組表示,漢字佔3個位元組

回車換行符,單字節,十六進位表示為0d 0a

轉換原理:先把字元編碼轉為UTF-8,然後再從UTF-8轉換為對應的字元編碼。

CharsetConv.class.php

#
<?php
/** 字符编码转换类, ANSI、Unicode、Unicode big endian、UTF-8、UTF-8+Bom互相转换
*   Date:   2015-01-28
*   Author: fdipzone
*   Ver:    1.0
*
*   Func:
*   public  convert       转换
*   private convToUtf8    把编码转为UTF-8编码
*   private convFromUtf8  把UTF-8编码转换为输出编码
*/
class CharsetConv{ // class start
    private $_in_charset = null;   // 源编码
    private $_out_charset = null;  // 输出编码
    private $_allow_charset = array(&#39;utf-8&#39;, &#39;utf-8bom&#39;, &#39;ansi&#39;, &#39;unicode&#39;, &#39;unicodebe&#39;);
    /** 初始化
    * @param String $in_charset  源编码
    * @param String $out_charset 输出编码
    */
    public function __construct($in_charset, $out_charset){
        $in_charset = strtolower($in_charset);
        $out_charset = strtolower($out_charset);
        // 检查源编码
        if(in_array($in_charset, $this->_allow_charset)){
            $this->_in_charset = $in_charset;
        }
        // 检查输出编码
        if(in_array($out_charset, $this->_allow_charset)){
            $this->_out_charset = $out_charset;
        }
    }
    /** 转换
    * @param  String $str 要转换的字符串
    * @return String      转换后的字符串
    */
    public function convert($str){
        $str = $this->convToUtf8($str);   // 先转为utf8
        $str = $this->convFromUtf8($str); // 从utf8转为对应的编码
        return $str;
    }
    /** 把编码转为UTF-8编码
    * @param  String $str 
    * @return String
    */
    private function convToUtf8($str){
        if($this->_in_charset==&#39;utf-8&#39;){ // 编码已经是utf-8,不用转
            return $str;
        }
        switch($this->_in_charset){
            case &#39;utf-8bom&#39;:
                $str = substr($str, 3);
                break;
            case &#39;ansi&#39;:
                $str = iconv(&#39;GBK&#39;, &#39;UTF-8//IGNORE&#39;, $str);
                break;
            case &#39;unicode&#39;:
                $str = iconv(&#39;UTF-16le&#39;, &#39;UTF-8//IGNORE&#39;, substr($str, 2));
                break;
            case &#39;unicodebe&#39;:
                $str = iconv(&#39;UTF-16be&#39;, &#39;UTF-8//IGNORE&#39;, substr($str, 2));
                break;
            default:
                break;
        }
        return $str;
    }
    /** 把UTF-8编码转换为输出编码
    * @param  String $str
    * @return String
    */
    private function convFromUtf8($str){
        if($this->_out_charset==&#39;utf-8&#39;){ // 输出编码已经是utf-8,不用转
            return $str;
        }
        switch($this->_out_charset){
            case &#39;utf-8bom&#39;:
                $str = "\xef\xbb\xbf".$str;
                break;
            case &#39;ansi&#39;:
                $str = iconv(&#39;UTF-8&#39;, &#39;GBK//IGNORE&#39;, $str);
                break;
            case &#39;unicode&#39;:
                $str = "\xff\xfe".iconv(&#39;UTF-8&#39;, &#39;UTF-16le//IGNORE&#39;, $str);
                break;
            case &#39;unicodebe&#39;:
                $str = "\xfe\xff".iconv(&#39;UTF-8&#39;, &#39;UTF-16be//IGNORE&#39;, $str);
                break;
            default:
                break;
        }
        return $str;
    }
} // class end
?>

##demo: unicode big endian 轉為utf-8 bom

afe612444d886363ae90ca7ae28be542convert($str);
file_put_contents('response/utf-8bom.txt', $response, true);
?>
php 字元編碼轉換類,支援ANSI、Unicode、Unicode big endian、UTF-8、UTF-8 Bom 互相轉換的相關內容,更多相關內容請追蹤php中文網。

相關推薦:

php str_replace 取代指定次數方法的解說

關於header,headers_sent,headers_list,header_remove 使用說明

透過PDO 查詢mysql傳回欄位整數變成String型的解決方法

以上是php 字元編碼轉換類別的相關內容的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn