六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 32|回复: 0

php中ASCⅡ码

[复制链接]

升级  14.6%

179

主题

179

主题

179

主题

进士

Rank: 4

积分
573
 楼主| 发表于 2013-1-26 13:50:05 | 显示全部楼层 |阅读模式
<?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 /> ' ;     } 
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表