Maison >développement back-end >tutoriel php >Contenu lié à la classe de conversion de codage de caractères PHP

Contenu lié à la classe de conversion de codage de caractères PHP

jacklove
jackloveoriginal
2018-06-09 11:10:332284parcourir

Classe de conversion d'encodage de caractères PHP, prend en charge ANSI, Unicode, Unicode big endian, UTF-8, UTF-8+Bom et la conversion mutuelle.

Quatre méthodes courantes d'encodage de fichiers texte

Encodage ANSI  :

Aucun en-tête de fichier (octet de drapeau au début de l'encodage du fichier)

L'encodage ANSI alphanumérique occupe un octet, les caractères chinois occupent deux octets

Caractère de retour chariot et de saut de ligne, octet unique, représentation hexadécimale est 0d 0a

Codage UNICODE :

En-tête de fichier, représentation hexadécimale est FF FE

Chaque caractère est codé avec deux octets

Retour chariot et ligne caractère de flux, double octet, représentation hexadécimale est 000d 000a

Codage Unicode big endian :

La représentation hexadécimale de l'en-tête du fichier est FE FF

L'encodage suivant place le bit haut du caractère à l'avant et le bit bas à l'arrière, ce qui est exactement le même que l'encodage Unicode inversé

retour chariot et saut de ligne, double octets, représentation hexadécimale est 0d00 0a00

Codage UTF-8 :

En-tête de fichier, représentation hexadécimale est EF BB BF

UTF-8 est une longueur variable d'encodage de caractères Unicode, de chiffres, de lettres, de retour chariot et Les sauts de ligne sont tous représentés par un octet. Les caractères chinois occupent 3 octets

retour chariot et saut de ligne, un seul octet, représentation hexadécimale Pour 0d 0a

Principe de conversion : convertissez d'abord l'encodage de caractères en UTF-8, puis convertissez de UTF-8 en encodage de caractères correspondant.

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
?>

démo :unicode big endian vers utf-8+bom

afe612444d886363ae90ca7ae28be542convert($str);
file_put_contents('response/utf-8bom.txt', $response, true);
?>

classe de conversion d'encodage de caractères php, prend en charge ANSI, Unicode, Unicode big endian, UTF-8, UTF-8+ Bom contenu lié à la conversion, veuillez faire attention au site Web chinois php pour plus de contenu connexe.

Recommandations associées :

Explication de la méthode de remplacement php str_replace pour des heures spécifiées

À propos de l'utilisation de header, headers_sent, headers_list, header_remove Description

La solution pour changer le type de champ entier renvoyé par MySQL via PDO en type String

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn