配置:win2003 thinkphp IIS6 php5.2 验证码乱码
说明:仅供参考
当遇到这样的问题都会感到很奇怪,本地是好的为什么放到服务器上就乱码了,或者从这台服务器换到另外一台服务器就乱码了,
乱码效果:
用tp自带的类生成验证码,主要用到Image.class.php 与 String.class.php
1:我们单独把Image.class.php 与 String.class.php 拉出来在服务器上做个测试,看是否能正常生成验证码,
测试结果是正常的,说明乱码与Image.class.php 和 String.class.php 无关
2:然后我们去测试正常与不正常的差别<curl 访问查看信息同学提醒的>
3:发现头部信息异常
import("ORG.Util.Image");
Image::buildImageVerify(4);
这是我调用生成验证码方式,我们继续查看头部信息是哪里定义的
在Image.class.php 找到输出方法
static function output($im, $type='png', $filename='') {
header("Content-type: image/" . $type);
$ImageFun = 'image' . $type;
if (empty($filename)) {
$ImageFun($im);
} else {
$ImageFun($im, $filename);
}
imagedestroy($im);
exit();
}
header("Content-type: image/" . $type); 没有生效
再尝试在方法下添加header('Location: http://www.baidu.com/');根本没有跳转
最终目标订到header("Content-type: image/" . $type);没有生效,输出没有定义是图片类型,所以乱码,
4:解决
@1一般遇到这样的问题都是查看验证码输出前是不是有别的输出,
@2查看文件编码,
@3是否存在BOM
其实很多都是存在BOM,只是我们不易发现,
当我尝试把debug关闭的时候刷新几下,居然好了....重复测试几次debug关闭正常 开启乱码
这就好办,肯定是当debug开启的时候,配置数据是从加载的文件里面读取的,要读取数据的文件里面存在BOM,debug关闭的时候配置数据是从~runtime.php里面读取的,
不再去加载文件里读取,所以不存在BOM
我们就去查找~runtime.php加载了哪些文件数据信息
最后找到common.php 下面存在BOM <容易犯的错误:经常会去<?php 前面去看有没有BOM>
例如: