php 中文验证码生成与调用方法
在php中要生成中文验证码就必须做与生成验证验证码不一样的操作,因为GD函数只接受UTF8格式编码的文字,所以在用php生成中文验证码时面要前首先要进行编码转换,操作php的iconv可以实例.
php 中文验证码生成与调用方法,代码如下:
$ch_str="你要生成中文验证码汉字"; $str=array(); for ($i=0;$i<strlen($ch_str);$i+=3) { $str[]=$ch_str[$i].$ch_str[$i+1].$ch_str[$i+2]; } //图片的长和高 $image_x=200; $image_y=100; $im = imagecreate($image_x,$image_y); //这里取图片底色为白色 $bkg = imagecolorallocate($im,255,255,255); //显示的字体样式,这个要把文件放到对应的目录中,如果你没有文件就去window的字体文件中找一个吧。 $fnt = "simfang.ttf"; //为图像分配一些颜色 $white=imagecolorallocate($im,234,185,95); //在图片上画椭圆弧,指定下坐标点 imagearc($im, 150, 8, 20, 20, 75, 170, $white); imagearc($im, 180, 7,50, 30, 75, 175, $white); //在图片上画一条线段,指定下坐标点 imageline($im,20,20,180,30,$white); imageline($im,20,18,170,50,$white); imageline($im,25,50,80,50,$white); //乱点的数量 $noise_num=3000; $line_num=80; //各种混乱字符的颜色 $rectangle_color=imagecolorallocate($im,0xaa,0xaa,0xaa); $noise_color=imagecolorallocate($im,0x00,0x00,0x00); $font_color=imagecolorallocate($im,0x00,0x00,0x00); for($i=0;$i<$noise_num;$i++) { //在一个坐标点上画一个单一像素,这个点上面定义了,是黑色的。 imagesetpixel($im,mt_rand(0,$image_x),mt_rand(0,$image_y),$noise_color); } for($i=0;$i<$line_num;$i++) { $line_color=imagecolorallocate($im,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255)); //在两个坐标点间画一条线,颜色在上面定义 imageline($im,mt_rand(0,$image_x),mt_rand(0,$image_y),mt_rand(0,$image_x),mt_rand(0,$image_y),$line_color); } $randnum=rand(0,count($str)-4); //保持是偶数 if ($randnum%2) { $randnum+=1; } $str1=$str[$randnum].$str[$randnum+1]; for ($i=0;$i<2;$i++) { imagettftext($im, rand(28,32), rand(0,70), rand(($image_x/4)*$i+$image_x/10,($image_x/4)*$i+$image_x/8), rand($image_y/2+$image_y/10,$image_y/2+$image_y/5), $font_color, $fnt, $str[$randnum+$i]); } imagepng($im); imagedestroy($im); //生成中文验证码二 $str="中文汉字"; $image_x=110; $image_y=110; $im = imagecreate($image_x,$image_y); $bkg = imagecolorallocate($im,255,255,255); $fnt = "hb.ttf"; //显示的字体样式 $white=imagecolorallocate($im,234,185,95); imagearc($im, 150, 8, 20, 20, 75, 170, $white); imagearc($im, 180, 7,50, 30, 75, 175, $white); imageline($im,20,20,180,30,$white); imageline($im,20,18,170,50,$white); imageline($im,25,50,80,50,$white); $noise_num=3000; $line_num=80; imagecolorallocate($im,0xff,0xff,0xff); $rectangle_color=imagecolorallocate($im,0xaa,0xaa,0xaa); $noise_color=imagecolorallocate($im,0x00,0x00,0x00); $font_color=imagecolorallocate($im,0x00,0x00,0x00); $line_color=imagecolorallocate($im,0x00,0x00,0x00); for($i=0;$i<$noise_num;$i++) imagesetpixel($im,mt_rand(0,$image_x),mt_rand(0,$image_y),$noise_color); for($i=0;$i<$line_num;$i++) imageline($im,mt_rand(0,$image_x),mt_rand(0,$image_y),mt_rand(0,$image_x),mt_rand(0,$image_y),$line_color); $randnum=rand(0,strlen($str)-4); if ($randnum%2)$randnum+=1; $str1=substr($str,$randnum,4); $str2 = iconv("gb2312","utf-8",$str1);//验证汉字在$str1里面 imagettftext($im, rand(28,32), rand(0,70), rand(25,27), rand(70,100), $font_color, $fnt, $str2); imagepng($im); imagedestroy($im); //把汉字放在数组 /* gd函数只接受utf8格式编码的文字,所以在写文字前首先要进行编码转换。php自带的iconv和mbstring库都可以完成这项工作 */ $randcode=array('宠'); $codetable=array(); $fp=fopen("gb2312.txt","r"); while($line=fgets($fp)) $codetable[hexdec(substr($line,0,6))]=substr($line,7,6); fclose($fp); //gb2312转utf8 function gb2utf8($gbstr) { global $codetable; if(trim($gbstr)=="") return $gbstr; $ret=""; $utf8=""; while($gbstr) { if(ord(substr($gbstr,0,1))>127) { $thisw=substr($gbstr,0,2); $gbstr=substr($gbstr,2,strlen($gbstr)); $utf8=""; @$utf8=u2utf8(hexdec($codetable[hexdec(bin2hex($thisw))-0x8080])); if($utf8!="") for($i=0;$i<strlen($utf8);$i+=3) $ret.=chr(substr($utf8,$i,3)); } else { $ret.=substr($gbstr,0,1); $gbstr=substr($gbstr,1,strlen($gbstr)); } } return $ret; } //unicode转utf8 function u2utf8($c) { $str=""; if($c<0x80) $str.=$c; elseif($c<0x800) { $str.=(0xc0|$c>>6); $str.=(0x80|$c&0x3f); } elseif($c<0x10000) { $str.=(0xe0|$c>>12); $str.=(0x80|$c>>6&0x3f); $str.=(0x80|$c&0x3f); } elseif($c<0x200000) { $str.=(0xf0|$c>>18); $str.=(0x80|$c>>12&0x3f); $str.=(0x80|$c>>6&0x3f); $str.=(0x80|$c&0x3f); } return $str; } //生成附加码 function create_excode($length) { global $randcode; header("content-type: image/png"); $image_x=$length*30; //图片宽度 $image_y=40; //图片高度 $noise_num=80*$length; //杂点数量 $line_num=$length-2; //干扰线数量 $image=imagecreate($image_x,$image_y); imagecolorallocate($image,0xff,0xff,0xff); //设定背景颜色 $rectangle_color=imagecolorallocate($image,0xaa,0xaa,0xaa); //边框颜色 $noise_color=imagecolorallocate($image,0x00,0x00,0x00); //杂点颜色 $font_color=imagecolorallocate($image,0x00,0x00,0x00); //字体颜色 $line_color=imagecolorallocate($image,0x33,0x33,0x33); //干扰线颜色 //加入杂点 for($i=0;$i<$noise_num;$i++) imagesetpixel($image,mt_rand(0,$image_x),mt_rand(0,$image_y),$noise_color); $font_face="simkai.ttf"; //字体 $x=2; $session_code=''; for($i=0;$i<$length;$i++) { $code=$randcode[mt_rand(0,count($randcode)-1)]; imagettftext($image,18,mt_rand(-6,6),$x,29,$font_color,$font_face,gb2utf8($code)); $x+=30; $session_code.=$code; } @session_start(); $_session['excode']=$session_code; //把附加码的值放在session中 //加入干扰线 for($i=0;$i<$line_num;$i++) imageline($image,mt_rand(0,$image_x),mt_rand(0,$image_y), mt_rand(0,$image_x),mt_rand(0,$image_y),$line_color); imagerectangle($image,0,0,$image_x-1,$image_y-1,$rectangle_color); //加个边框 imagepng($image); imagedestroy($image); } create_excode(6);
使用的时候直接用html语法:<img src="excode.php">调用就可以了,在服务端做验证时取session存储的验证字符与用户提交的字符进行比较,相同则通过验证.
本文地址:http://www.phprm.com/tuxiang/fs4460.html
转载随意,但请附上文章地址:-)