求utf-8 转gb2312 代码

时间:2006-12-21 15:07:03   来源:  作者:whsong  点击:次  出处:技术无忧
关键字:求ut

<?php

/**
* @desc the class can convert target string into "GBK","UTF-8","UTF-16BE","UTF-16LE","BIG5"
*/
class Encoding
{
  var $GetEncoding="1";
  var $ToEncoding="3";
   var $UnicodeString="";
   var $Encodings=array("1"=>"GBK","2"=>"UTF-8","3"=>"UTF-16BE","4"=>"UTF-16LE","5"=>"BIG5");
   var $FilePath="";
   function SetGetEncoding($GetEncoding)
   {
       $order=0;
       if ($this->CheckEncoding($GetEncoding,$order)) {
          $this->GetEncoding=$order;
           return true;
       }
       echo "Warning:You have been set unrecognized code type, the code will be not changed!";
       return false;
   }
   function SetToEncoding($ToEncoding)
   {
       $order=0;
       if ($this->CheckEncoding($ToEncoding,$order)) {
          $this->ToEncoding=$order;
           return true;
       }
       echo "Warning:You have been set unrecognized code type, the code will be not changed!";
       return false;
   }
   function EncodeString($String)
   {
      if ($this->GetEncoding=="1") {
        $this->UnicodeString=$this->GBKToUnicode($String);
      }
       elseif ($this->GetEncoding=="2") {
          $this->UnicodeString=$this->UTFToUnicode($String);
       }
       elseif ($this->GetEncoding=="3") {
          $this->UnicodeString=$String;
       }
       elseif ($this->GetEncoding=="4") {
          $this->UnicodeString=$this->ChangeByte($String);
       }
       elseif ($this->GetEncoding=="5") {
          $this->UnicodeString=$this->BIGToUnicode($String);
       }
       if ($this->ToEncoding=="1") {
        return $this->UnicodeToGBK($this->UnicodeString);
      }
       elseif ($this->ToEncoding=="2") {
          return $this->UnicodeToUTF($this->UnicodeString);
       }
       elseif ($this->ToEncoding=="3") {
          return $this->UnicodeString;
       }
       elseif ($this->ToEncoding=="4") {
          return $this->ChangeByte($this->UnicodeString);
       }
       elseif ($this->ToEncoding=="5") {
          return $this->UnicodeToBIG($this->UnicodeString);
       }
   }
   function GBKToUnicode(&$String)
   {
      $UnicodeData=file($this->FilePath."gbkunicode.data");
       $ReturnString="";
       $StringLength=strlen($String);
       $p="";
       $q="";
       for($i=0;$i<$StringLength;$i++){
           if(($p=ord(substr($String,$i,1)))>128){
               $q=ord(substr($String,++$i,1));
               if ($p>254) {
                  $ReturnString.="003f";
               }
               elseif ($q<64||$q>254) {
                  $ReturnString.="003f";
               }
               else {
                   $q=($q-64)*4;
                   $ReturnString.=substr($UnicodeData[$p-128],$q,4);
               }
           }
           else {
               if ($p==128) {
                  $ReturnString.="20ac";
               }
               else {
                   $ReturnString.="00";
                   $ReturnString.=dechex($p);
               }
           }
       }
       return $this->hex2bin($ReturnString);
   }
   function BIGToUnicode(&$String)
   {
      $UnicodeData=file($this->FilePath."bigunicode.data");
       $ReturnString="";
       $StringLength=strlen($String);
       $p="";
       $q="";
       for($i=0;$i<$StringLength;$i++){
           if(($p=ord(substr($String,$i,1)))>128){
               $q=ord(substr($String,++$i,1));
               if ($p>249) {
                  $ReturnString.="003f";
               }
               elseif ($q<64||$q>254) {
                  $ReturnString.="003f";
               }
               else {
                   $q=($q-64)*4;
                   $ReturnString.=substr($UnicodeData[$p-160],$q,4);
               }
           }
           else {
               $ReturnString.="00";
               $ReturnString.=dechex($p);
           }
       }
       return $this->hex2bin($ReturnString);
   }
   function UnicodeToGBK(&$String)
   {
      $GBKData=file($this->FilePath."unicodegbk.data");
       $ReturnString="";
       $StringLength=strlen($String);
       $p="";
       $q="";
       $temp="";
       for($i=0;$i<$StringLength;$i++){
           $p=ord(substr($String,$i++,1));
           if ($i==$StringLength) {
              $temp=dechex($p);
               if (strlen($temp)<2) {
                  $temp="0".$temp;
               }
               $ReturnString.=$temp;
               continue;
           }
           $q=ord(substr($String,$i,1));
           if ($p==0&&$q<127) {
              $temp=dechex($q);
               if (strlen($temp)<2) {
                  $temp="0".$temp;
               }
               $ReturnString.=$temp;
               continue;
           }
           $p++;
           $begin=hexdec(substr($GBKData[$p],0,2));
           if (strlen($GBKData[$p])<3||$q<$begin||$q>hexdec(substr($GBKData[$p],2,2))) {
              $ReturnString.="3f";
               continue;
           }
           $q*=4;
           $q-=$begin*4;
           $temp=substr($GBKData[$p],$q+4,2);
           if ($temp=="00") {
              $ReturnString.=substr($GBKData[$p],$q+6,2);
           }
           else {
              $ReturnString.=$temp.substr($GBKData[$p],$q+6,2);
           }
       }
       return $this->hex2bin($ReturnString);
   }
   function UnicodeToBIG(&$String)
   {
      $BIGData=file($this->FilePath."unicodebig.data");
       $ReturnString="";
       $StringLength=strlen($String);
       $p="";
       $q="";
       $temp="";
       for($i=0;$i<$StringLength;$i++){
           $p=ord(substr($String,$i++,1));
           if ($i==$StringLength) {
              $temp=dechex($p);
               if (strlen($temp)<2) {
                  $temp="0".$temp;
               }
               $ReturnString.=$temp;
               continue;
           }
           $q=ord(substr($String,$i,1));
           if ($p==0&&$q<127) {
              $temp=dechex($q);
               if (strlen($temp)<2) {
                  $temp="0".$temp;
               }
               $ReturnString.=$temp;
               continue;
           }
           $p++;
           $begin=hexdec(substr($BIGData[$p],0,2));
           if (strlen($BIGData[$p])<3||$q<$begin||$q>hexdec(substr($BIGData[$p],2,2))) {
              $ReturnString.="3f";
               continue;
           }
           $q*=4;
           $q-=$begin*4;
           $temp=substr($BIGData[$p],$q+4,2);
           if ($temp=="00") {
              $ReturnString.=substr($BIGData[$p],$q+6,2);
           }
           else {
              $ReturnString.=$temp.substr($BIGData[$p],$q+6,2);
           }
       }
       return $this->hex2bin($ReturnString);
   }
   function UnicodeToUTF(&$String)
   {
       $len=strlen($String);
       $ReturnString="";
       for ($x=0;$x<$len;$x++) {
          $Char=substr($String,$x++,1);
           if ($x==$len) {
              $ReturnString.=bin2hex($Char);
               continue;
           }
           $Char.=substr($String,$x,1);
           $hex=bin2hex($Char);
           $dec=hexdec($hex);
           $bin=decbin($dec);
           $temp="";
           if($dec>0x7f){
               $binlen=strlen($bin);
               for ($i=0;$i<16-$binlen;$i++) {
                  $bin="0".$bin;
               }
               $temp.="1110".substr($bin,0,4);
               $temp.="10".substr($bin,4,6);
               $temp.="10".substr($bin,10,6);
               $temp=dechex(bindec($temp));
           }
           else {
               $temp=substr($hex,2,2);
           }
           $ReturnString.=$temp;
       }
       return $this->hex2bin($ReturnString);
   }
   function ChangeByte(&$String)
   {
      $len=strlen($String);
       $ReturnString="";
       for ($i=0;$i<$len;$i++) {
           if ($i+1!=$len) {
              $ReturnString.=substr($String,$i+1,1).substr($String,$i++,1);
           }
           else {
              $ReturnString.=substr($String,$i,1);
           }
       }
       return $ReturnString;
   }
   function UTFToUnicode(&$String)
   {
      $UTFlen=strlen($String);
       $x="";
       $y="";
       $z="";
       $ReturnString="";
       for ($i=0;$i<$UTFlen;$i++) {
          if(($x=ord(substr($String,$i,1)))>128){
               if ($i+1==$UTFlen) {
                  $ReturnString.=dechex($x);
                   continue;
               }
               $y=ord(substr($String,++$i,1));
               if ($i+1==$UTFlen) {
                  $ReturnString.=dechex($x).dechex($y);
                   continue;
               }
               $x=decbin($x);
               $y=decbin($y);
               $z=decbin(ord(substr($String,++$i,1)));
               $temp=dechex(bindec(substr($x,4,4).substr($y,2,4).substr($y,6,2).substr($z,2,6)));
               $len=strlen($temp);
               for ($j=0;$j<4-$len;$j++) {
                  $temp="0".$temp;
               }
               $ReturnString.=$temp;
           }
           else {
               $ReturnString.="00";
              $ReturnString.=dechex($x);
           }
       }
       return $this->hex2bin($ReturnString);
   }
   function hex2bin(&$String)
   {
       $ReturnString="";
      $len=strlen($String);
       for($i=0;$i<$len;$i+=2) {
           $ReturnString.= pack("C",hexdec(substr($String,$i,2)));
       }
       return $ReturnString;
   }
   
   function CheckEncoding($Encoding,&$order)
   {
       $order=0;
       reset($this->Encodings);
      while (list($key,$value)=each($this->Encodings)) {
        if ($Encoding==$value) {
               $order=$key;
            return true;
        }
      }
       return false;
   }
   
   function SetFilePath( $strFilePath )
   {
       CFX_ASSERT( file_exists($strFilePath), __FILE__, __LINE__, "Unable to Find the encoding file which was specified!");
       $this->FilePath = $strFilePath;
   }
}
?>


相关文章

    无相关信息

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面