问题是这样产生的:
我想写一个php来遍历当前php所在文件夹下的文件及目录,因此写了下面的代码.
PHP
<!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>丸子的Demonstration</title></head><body><?php function lsfile(){$files=glob(‘*’);//scandir(dirname(__FILE__));foreach($files as $val)if($val!= ». » and $val!= ».. » and $val!= »index.php »)echo « <li><a href=\ » ».urlencode($val). »\ »> ».$val. »</a></li> »;}?><ol id= »demo »><?phplsfile();?></ol></body></html> |
可是事实并没有我想的这么简单,$val输出的中文是乱码!于是,我按照常规的编码检查方式查了一遍,发现文件编码是utf-8,meta设置的是utf-8,浏览器使用的还是utf-8,编码都是一致的,而且如果是直接echo中文的话,并不会是乱码,那么问题出在哪里呢?跟几个朋友讨论后未果.Along说把文件保存成ANSI,再保存成utf-8,失败!文件发给netseye测试,正常显示中文!难道是我本地服务器的问题?或者是php函数读取中文时的问题?于是,我上传到我的php空间访问,乱码!于是,我纠结了!但是,我有一个发现,如果浏览器编码改成gb2312,中文就正常显示了!这是为什么呢?知道了这个以后,我有了临时的解决方案:将中文输出前先转换编码,转换方式为iconv(“gb2312″,”utf-8″,$val);完整代码如下:
PHP
<!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>丸子的Demonstration</title></head><body><?php function lsfile(){$files=glob(‘*’);//scandir(dirname(__FILE__));foreach($files as $val)if($val!= ». » and $val!= ».. » and $val!= »index.php »)echo « <li><a href=\ » ».urlencode($val). »\ »> ».iconv(« gb2312″, »utf-8″,$val). »</a></li> »;}?><ol id= »demo »><?phplsfile();?></ol></body></html> |
至于原因,定位在php函数的读取上,Leeiio给了我一个重要的提示,让我恍然大悟:不同的文件系统对文件名或文件夹名的编码是不一样的,我想这就是为什么同一个文件在不同的电脑里测试结果不一样的原因了.于是我想从php文件流编码着手,看看是否能够通过函数设置全局编码而不是每次都转换.继续跟朋友讨论研究.希望能得到一个满意的结果.