最近对PHP比较感兴趣,就在网上找几个实例来学习一下.发现"鱼尾唯一"兄有一篇文章谈到了PHP汉字验证码,觉得挺有意思,就在自己本机上调试了一下.不过却发现有不少问题,尤其中文乱码比较严重.也许是我的PHP环境配置有问题,不过我确实遇到了问题,经过各种努力最终解决了这个小程序的中文乱码问题,好记性不如烂笔头,在此记下来,以备后用.同时也给遇到同样问题的朋友提供一点儿启发.
原文地址:http://hi.baidu.com/yuweiweiyi/blog/item/76f63829858c91fc98250a01.html
First file:
<?php
/**
* File name: chinesechar.php
* Function: store chinese character
* CharSet: GB2312
* Mender: kogo
* Blog: http://hi.csdn.net/kogo2005
* Date: 2007-12-26
*/
$chineseChar = array("中","国","辽","宁","省","大","连","市","沙","河","口","区","五","一","路");
?>
Second file:
<?php
/**
* File name: code.php
* Function: Output the code image
* CharSet: UTF-8 或 GB2312
* Mender: kogo
* Blog: http://hi.csdn.net/kogo2005
* Date: 2007-12-26
*/
include_once("chinesechar.php");
session_start();
//设置content-type
header("Content-type: image/png");
//创建图片
$img = imagecreatetruecolor(120,30);
//创建颜色
$frontColor = imagecolorallocate($img,255,255,255);
$bgColor = imagecolorallocate($img,0,0,0);
//设置文字
$text = '';
for($i=0;$i<4;$i++){
$rand_keys = array_rand($chineseChar,4);
$text.=$chineseChar[$rand_keys[$i]];
}
//在将code保存进session之前,一定要转成UTF-8编码
$_SESSION['code'] = iconv("GB2312","UTF-8",$text);
//此处一定要用中文字体
$font = 'STFANGSO.TTF';
//添加文字
imagettftext($img,18,2,11,20,$frontColor,$font,iconv("GB2312","UTF-8",$text));
//输出图片
imagepng($img);
//销毁图片
imagedestroy($img);
?>
Third file:
<?php
/**
* File name: validate.php
* Function: Output the form and validate user's input
* CharSet: UTF-8
* Mender: kogo
* Blog: http://hi.csdn.net/kogo2005
* Date: 2007-12-26
*/
session_start();
$message = '';
//验证用户输入是否与验证一致
if(isset($_POST['check'])&&!is_null($_POST['check'])){
if(strcasecmp($_SESSION['code'],$_POST['code'])==0)
$message = "<p style=/"font-size:12px;color:009900;/">验证成功!</p>";
else $message = "<p style=/"font-size:12px;color:990000;/">验证失败!</p>";
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<body>
<?php
if($message) echo $message;
?>
<form action="<?php echo $_SERVER['PHP_SELF']?>" method="post">
<table><tr><td>
请输入验证码: <input type="text" name="code"/> </td><td> <img src="code.php" /><br /></td></tr>
<tr><td colspan=2><input type="submit" name="check" value="提交验证" /></td></tr></table>
</form>
</body>
</html>
一共三个文件,却要用不同的编码,我也不太清楚为什么,只是经过几次尝试才发现这样组合就能解决问题.
总结如下:
1.保存汉字数组的文件要用GB2312编码
2.生成图片的文件两种编码都可以
3.在将code保存进session之前,一定要转成UTF-8编码
4.验证码中的汉字一定要用中文字体
5.输出表单页面要用UTF-8编码
也许这种问题的解决会因为环境的不同而方法不同,以上仅供参考.