日志
相册

首页

 > 

日志

 > 

程序心得

 >  php 字符编码转换类,支持ANSI、Unicode、Unicode big endian、UTF-8、UTF-8+Bom 互相转换


php 字符编码转换类,支持ANSI、Unicode、Unicode big endian、UTF-8、UTF-8+Bom 互相转换


作者:转载 ---日期:2017-07-26 点击:27

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

  1. <?php  
  2. /** 字符编码转换类, ANSI、Unicode、Unicode big endian、UTF-8、UTF-8+Bom互相转换 
  3. *   Date:   2015-01-28 
  4. *   Author: fdipzone 
  5. *   Ver:    1.0 
  6. * 
  7. *   Func: 
  8. *   public  convert       转换 
  9. *   private convToUtf8    把编码转为UTF-8编码 
  10. *   private convFromUtf8  把UTF-8编码转换为输出编码 
  11. */  
  12.   
  13. class CharsetConv{ // class start  
  14.   
  15.     private $_in_charset = null;   // 源编码  
  16.     private $_out_charset = null;  // 输出编码  
  17.     private $_allow_charset = array('utf-8''utf-8bom''ansi''unicode''unicodebe');  
  18.   
  19.   
  20.     /** 初始化 
  21.     * @param String $in_charset  源编码 
  22.     * @param String $out_charset 输出编码 
  23.     */  
  24.     public function __construct($in_charset$out_charset){  
  25.   
  26.         $in_charset = strtolower($in_charset);  
  27.         $out_charset = strtolower($out_charset);  
  28.   
  29.         // 检查源编码  
  30.         if(in_array($in_charset$this->_allow_charset)){  
  31.             $this->_in_charset = $in_charset;  
  32.         }  
  33.   
  34.         // 检查输出编码  
  35.         if(in_array($out_charset$this->_allow_charset)){  
  36.             $this->_out_charset = $out_charset;  
  37.         }  
  38.   
  39.     }  
  40.   
  41.   
  42.     /** 转换 
  43.     * @param  String $str 要转换的字符串 
  44.     * @return String      转换后的字符串 
  45.     */  
  46.     public function convert($str){  
  47.   
  48.         $str = $this->convToUtf8($str);   // 先转为utf8  
  49.         $str = $this->convFromUtf8($str); // 从utf8转为对应的编码  
  50.   
  51.         return $str;  
  52.     }  
  53.   
  54.   
  55.     /** 把编码转为UTF-8编码 
  56.     * @param  String $str  
  57.     * @return String 
  58.     */  
  59.     private function convToUtf8($str){  
  60.   
  61.         if($this->_in_charset=='utf-8'){ // 编码已经是utf-8,不用转  
  62.             return $str;  
  63.         }  
  64.   
  65.         switch($this->_in_charset){  
  66.             case 'utf-8bom':  
  67.                 $str = substr($str, 3);  
  68.                 break;  
  69.   
  70.             case 'ansi':  
  71.                 $str = iconv('GBK''UTF-8//IGNORE'$str);  
  72.                 break;  
  73.   
  74.             case 'unicode':  
  75.                 $str = iconv('UTF-16le''UTF-8//IGNORE'substr($str, 2));  
  76.                 break;  
  77.   
  78.             case 'unicodebe':  
  79.                 $str = iconv('UTF-16be''UTF-8//IGNORE'substr($str, 2));  
  80.                 break;  
  81.   
  82.             default:  
  83.                 break;  
  84.         }  
  85.   
  86.         return $str;  
  87.   
  88.     }  
  89.   
  90.   
  91.     /** 把UTF-8编码转换为输出编码 
  92.     * @param  String $str 
  93.     * @return String 
  94.     */  
  95.     private function convFromUtf8($str){  
  96.   
  97.         if($this->_out_charset=='utf-8'){ // 输出编码已经是utf-8,不用转  
  98.             return $str;  
  99.         }  
  100.   
  101.         switch($this->_out_charset){  
  102.             case 'utf-8bom':  
  103.                 $str = "\xef\xbb\xbf".$str;  
  104.                 break;  
  105.   
  106.             case 'ansi':  
  107.                 $str = iconv('UTF-8''GBK//IGNORE'$str);  
  108.                 break;  
  109.   
  110.             case 'unicode':  
  111.                 $str = "\xff\xfe".iconv('UTF-8''UTF-16le//IGNORE'$str);  
  112.                 break;  
  113.   
  114.             case 'unicodebe':  
  115.                 $str = "\xfe\xff".iconv('UTF-8''UTF-16be//IGNORE'$str);  
  116.                 break;  
  117.   
  118.             default:  
  119.                 break;  
  120.         }  
  121.   
  122.         return $str;  
  123.   
  124.     }  
  125.   
  126.   
  127. // class end  
  128.   
  129. ?> 
  130. demo:unicode big endian 转为 utf-8+bom
     
    1. <?php  
    2. require "CharsetConv.class.php";  
    3.   
    4. $str = file_get_contents('source/unicodebe.txt');  
    5.   
    6. $obj = new CharsetConv('unicodebe''utf-8bom');  
    7. $response = $obj->convert($str);  
    8.   
    9. file_put_contents('response/utf-8bom.txt'$response, true);  
    10. ?> 






你的名字:
邮件地址:
你的评论:



心灵车站全球战略伙伴:U5Buy.com    卓创国际   朝阳印刷   金士盟逆变器   陆祺电子


加盟Email:raptor@raptorzhang.com
版权保护 如有雷同 必然追究