wangshaofei 发表于 2013-1-26 13:50:05

php中ASCⅡ码

<?phpclass ascii{function decode ( $str ){   preg_match_all ( " /(d{2,5})/ " , $str , $a ) ;   $a = $a [ 0 ] ;   foreach ( $a as $dec )   {         if ( $dec < 128 )         {             $utf .= chr ( $dec ) ;         }         else if ( $dec < 2048 )      {             $utf .= chr ( 192 + (( $dec - ( $dec % 64 )) / 64 )) ;             $utf .= chr ( 128 + ( $dec % 64 )) ;         }         else         {             $utf .= chr ( 224 + (( $dec - ( $dec % 4096 )) / 4096 )) ;             $utf .= chr ( 128 + ((( $dec % 4096 ) - ( $dec % 64 )) / 64 )) ;             $utf .= chr ( 128 + ( $dec % 64 )) ;         }   }   return $utf ;}function encode ( $c ){   $len = strlen ( $c ) ;   $a = 0 ;   while ( $a < $len )   {         $ud = 0 ;         if ( ord ( $c { $a }) >= 0 && ord ( $c { $a }) <= 127 )         {             $ud = ord ( $c { $a }) ;             $a += 1 ;         }         else if ( ord ( $c { $a }) >= 192 && ord ( $c { $a }) <= 223 )         {             $ud = ( ord ( $c { $a }) - 192 ) * 64 + ( ord ( $c { $a + 1 }) - 128 ) ;             $a += 2 ;         }         else if ( ord ( $c { $a }) >= 224 && ord ( $c { $a }) <= 239 )         {             $ud = ( ord ( $c { $a }) - 224 ) * 4096 + ( ord ( $c { $a + 1 }) - 128 ) * 64 + ( ord ( $c { $a + 2 }) - 128 ) ;             $a += 3 ;         }         else if ( ord ( $c { $a }) >= 240 && ord ( $c { $a }) <= 247 )         {             $ud = ( ord ( $c { $a }) - 240 ) * 262144 + ( ord ( $c { $a + 1 }) - 128 ) * 4096 + ( ord ( $c { $a + 2 }) - 128 ) * 64 + ( ord ( $c { $a + 3 }) - 128 ) ;             $a += 4 ;         }         else if ( ord ( $c { $a }) >= 248 && ord ( $c { $a }) <= 251 )         {             $ud = ( ord ( $c { $a }) - 248 ) * 16777216 + ( ord ( $c { $a + 1 }) - 128 ) * 262144 + ( ord ( $c { $a + 2 }) - 128 ) * 4096 + ( ord ( $c { $a + 3 }) - 128 ) * 64 + ( ord ( $c { $a + 4 }) - 128 ) ;             $a += 5 ;         }         else if ( ord ( $c { $a }) >= 252 && ord ( $c { $a }) <= 253 )         {             $ud = ( ord ( $c { $a }) - 252 ) * 1073741824 + ( ord ( $c { $a + 1 }) - 128 ) * 16777216 + ( ord ( $c { $a + 2 }) - 128 ) * 262144 + ( ord ( $c { $a + 3 }) - 128 ) * 4096 + ( ord ( $c { $a + 4 }) - 128 ) * 64 + ( ord ( $c { $a + 5 }) - 128 ) ;             $a += 6 ;         }         else if ( ord ( $c { $a }) >= 254 && ord ( $c { $a }) <= 255 )         { //error             $ud = false ;         }         $scill .= " &# $ud ; " ;   }   return $scill ;}最近在技术群中有位兄弟提出了一个问题:想让自增的ID格式化为A001——A999B001——B999……Z001——Z999,我最初的构思是循环中,分if条件判断出来进行A——Z字母,但是这样做有个极大的缺点,代码显得很呆板冗余,26个英文字母等于需要26个判断。后来有人支招将字母变成ASCⅡ码,恰好A——Z等于ASCⅡ码的65——91;这样就只需要一个函数进行格式化ID就可以了:    function format_string( $num ) {         $tag = floor (( $num - 1 ) / 999 );         // part1计算asc码         $part1 = 65 + $tag ;         // part2计算数字部分         $part2 = $num - 999 * $tag ;         $a = strlen ( $part2 );         for ( $i = 0 ; $i < ( 3 - $a ); $i ++ )         {          $b .= 0 ;         }         $str = chr ( $part1 ) . $b . $part2 ;         return $str ;   }   for ( $i = 1 ; $i < 5000 ; $i ++ )   {          echo   $str = format_string( $i ) . ' <br /> ' ;   } 
页: [1]
查看完整版本: php中ASCⅡ码