PHP汉字验证码中文乱码之解决方法

最近对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>&#160;<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编码

也许这种问题的解决会因为环境的不同而方法不同,以上仅供参考.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值