來源:互聯網
上載者:User
關鍵字
php
javascript
python
在做一個php中文驗證碼時,按原本的思路是將一段文字分割成一個個文字組成個文字數組,然後遍曆四次,隨機產生四個驗證文字,然後畫在image上,可是發現用`str_split($str,3)`來分割有時會少一個文字,換成`explode(" ",$str)`還是偶爾缺字。。。主要代碼如下:` $fontFace='aa.ttf'; $str=" 大 閘 是 中 國 主 導 品 牌 亦 行 業 協 會 重 點 推 薦 家 集 養 殖 與 銷 售"; $strDb=str_split($str,3);for($i=0;$i<4;$i++){ $fontColor=imagecolorallocate($img,mt_rand(0,120),mt_rand(0,120),mt_rand(0,120)); $index=mt_rand(0,count($strDb)+1); $cn=$strDb[$index]; $captcha.=$cn; $x=($i*120/4)+mt_rand(5,10); $y=mt_rand(25,45); imagettftext($img,15,mt_rand(-30,60),$x,$y,$fontColor,$fontFace,$cn);}`感覺是文字編碼的問題,位元組數設為4的時候也可以顯示部分文字,可是具體怎麼解決不知道,求協助,謝謝!
回複內容:
在做一個php中文驗證碼時,按原本的思路是將一段文字分割成一個個文字組成個文字數組,然後遍曆四次,隨機產生四個驗證文字,然後畫在image上,可是發現用`str_split($str,3)`來分割有時會少一個文字,換成`explode(" ",$str)`還是偶爾缺字。。。主要代碼如下:` $fontFace='aa.ttf'; $str=" 大 閘 是 中 國 主 導 品 牌 亦 行 業 協 會 重 點 推 薦 家 集 養 殖 與 銷 售"; $strDb=str_split($str,3);for($i=0;$i<4;$i++){ $fontColor=imagecolorallocate($img,mt_rand(0,120),mt_rand(0,120),mt_rand(0,120)); $index=mt_rand(0,count($strDb)+1); $cn=$strDb[$index]; $captcha.=$cn; $x=($i*120/4)+mt_rand(5,10); $y=mt_rand(25,45); imagettftext($img,15,mt_rand(-30,60),$x,$y,$fontColor,$fontFace,$cn);}`感覺是文字編碼的問題,位元組數設為4的時候也可以顯示部分文字,可是具體怎麼解決不知道,求協助,謝謝!
兩個點,第一個是$str不用空格分開,第二個是產生隨機index的時候,應該是-1,不是+1
像這種取數組中某個隨機值的時候,index可以用array_rand()
函數來產生
改完如下
$fontFace='aa.ttf'; $str="大閘是中國主導品牌亦行業協會重點推薦家集養殖與銷售"; $strDb=str_split($str,3);for($i=0;$i<4;$i++){ $fontColor=imagecolorallocate($img,mt_rand(0,120),mt_rand(0,120),mt_rand(0,120)); $index=array_rand($strDb); $cn=$strDb[$index]; $captcha.=$cn; $x=($i*120/4)+mt_rand(5,10); $y=mt_rand(25,45); imagettftext($img,15,mt_rand(-30,60),$x,$y,$fontColor,$fontFace,$cn);}
用mb擴充的函數處理字串,解決編碼問題,另外空格有啥用嗎?
如果$str含中英文用這個分割$strDb=preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY);