嘟嘟社区

[美国VPS] php验证码有懂的大佬吗?三天没弄好


本人纯菜鸟,实在搞不懂,只能来请教大佬了。
就是想要验证码显示中文,内容里填,英文和数字都正常,填中文就不显示。
真心求助大佬帮帮改改。
  1. <?php
  2. class Captcha
  3. {
  4.         var $width=’60’;
  5.         var $num=’4′;
  6.         var $height=’32’;
  7.         var $name=’randcode’;
  8.         public function __construct($conf="")
  9.         {
  10.                 if($conf!="")
  11.                 {
  12.                         foreach($conf as $key=>$value)
  13.                         {
  14.                                 $this->$key=$value;
  15.                         }
  16.                 }
  17.                
  18.         }
  19.        
  20.         function show()
  21.         {
  22.                 $CI = & get_instance();
  23.                 $CI->load->library(‘session’);
  24.             
  25.                 $border = 1; //是否要边框 1要:0不要
  26.                 $how = $this->num; //验证码位数
  27.                 $w = $this->width; //图片宽度
  28.                 $h = $this->height; //图片高度
  29.                 $fontsize = 24; //字体大小
  30.                 $alpha = "中文啊啊啊啊啊啊啊啊啊啊啊啊"; //验证码内容1
  31.                 $number = "中文啊啊啊啊啊啊啊啊啊啊啊"; //验证码内容2
  32.                 $randcode = ""; //验证码字符串初始化
  33.                 srand((double)microtime()*1000000); //初始化随机数种子
  34.                 $im = imagecreate($w,$h); //创建验证图片
  35.                
  36.                 /*
  37.                 * 绘制基本框架
  38.                 */
  39.                 $bgcolor = imagecolorallocate($im, 255, 255, 255); //设置背景颜色
  40.                 ImageFill($im, 0, 0, $bgcolor); //填充背景色
  41.                 if($border)
  42.                 {
  43.                         $black = ImageColorAllocate($im, 0, 0, 0); //设置边框颜色
  44.                         ImageRectangle($im, 0, 0, $w-1, $h-1, $black);//绘制边框
  45.                 }
  46.                
  47.                 /*
  48.                 * 逐位产生随机字符
  49.                 */
  50.                 for($i=0; $i<$how; $i++)
  51.                 {   
  52.                         $alpha_or_number = mt_rand(0, 1); //字母还是数字
  53.                         $str = $alpha_or_number ? $alpha : $number;
  54.                         $which = mt_rand(0, strlen($str)-1); //取哪个字符
  55.                         $code = substr($str, $which, 1); //取字符
  56.                         $j = !$i ? 4 : $j+15; //绘字符位置
  57.                         $color3 = ImageColorAllocate($im, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255)); //字符随即颜色
  58.                         imagettftext($im, 16, 0, $j, 24, $color3, ‘./simkai.ttf’, $code);
  59.                         $randcode .= $code; //逐位加入验证码字符串
  60.                 }
  61.                 /*
  62.                 * 添加干扰
  63.                 */
  64.                 for($i=0; $i<5; $i++)//绘背景干扰线
  65.                 {   
  66.                         $color1 = ImageColorAllocate($im, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255)); //干扰线颜色
  67.                         ImageArc($im, mt_rand(-5,$w), mt_rand(-5,$h), mt_rand(20,300), mt_rand(20,200), 55, 44, $color1); //干扰线
  68.                 }  
  69.                 for($i=0; $i<$how*5; $i++)//绘背景干扰点
  70.                 {   
  71.                         $color2 = ImageColorAllocate($im, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255)); //干扰点颜色
  72.                         ImageSetPixel($im, mt_rand(0,$w), mt_rand(0,$h), $color2); //干扰点
  73.                 }
  74.                
  75.                 $CI->session->set_userdata($this->name, $randcode);
  76.                 //ob_clean();
  77.                 /*绘图结束*/
  78.                 if (imagetypes() & IMG_GIF) {
  79.                     header ("Content-type: image/gif");
  80.                     $img=imagegif ($im);
  81.                 }
  82.                 elseif (imagetypes() & IMG_JPG) {
  83.                 header ("Content-type: image/jpeg");
  84.                     $img=imagejpeg ($im, "", 0.5);
  85.                 }
  86.                 elseif (imagetypes() & IMG_PNG) {
  87.                 header ("Content-type: image/png");
  88.                     $img=imagepng ($im, "", 0.5);
  89.             }
  90.             return $img;
  91.                 ImageDestroy($im);
  92.                 /*绘图结束*/
  93.         }
  94. }
  95. ?>

复制代码

你要笑死我,数字就1-9,英文就26个字母,你以为中文就打中文两字就行了吗
没ttf文件?
$which = mt_rand(0, mb_strlen($str,’utf8′)-1); //取哪个字符
$code = mb_substr($str, $which, 1,’utf8′); //取字符
4楼正解
自行查阅strlen和mb_strlen、substr和mb_substr的区别

确保你引入的字体支持中文