php乱码问题1
首先要明确:乱码问题基本都是编码(包括字符编码和文件编码)不对引起的.
乱码分从服务器端到客户端的乱码和从客户端到服务器端的乱码(包括AJAX的乱码),[多怀念步兵团啊...]以下分别详解(说得不对望指正):
现象:
1. 页面代码写得好好的,保存放服务器后,访问一看,页面的静态文本变成一堆筹码(这个不单是PHP会出现).
2. 存到Mysql里面的文本变成乱码(可能最终在页面却正常显示).
3. 虽然Mysql里面的文本显示不是乱码,但php页面加载时从数据库取出来的文本是乱码
4. 页面一切正常,但是用AJAX往服务器取数据,得到的结果是乱码
解决:
1. 静态文本在浏览器显示乱码的情况,属于文件编码跟html页面的header不一致.改成同样就ok
页面编码:
用notepad最简单,保存时有个编码选择列表可以选择.
如果用Zend Studio的话,在页面文件(如index.php)-properties-resource-text file encoding可以设置页面编码方式.
在meta设置header编码:
<meta content="text/html; charset=UTF-8" http-equiv="content-type"/> //utf8
<meta content="text/html; charset=GB2312" http-equiv="content-type"/> //简体中文
如果是用php也可以:
<?php header("Content-type: text/html; charset=utf-8"); ?>
这个方法要注意一点:在这一句前不能向页面输出任何内容,即不能使用echo等语句,也不能输出html标签或文字.反正把这一句放到第一行,从第一个字符开始就行...
2. 保存到mysql里面的文本变乱码,可能是文本的编码跟数据库的编码不一致,数据库的编码包括(database/table/column),所以在创建mysql数据库/创建表/创建列时,[整理]这一项都要和页面header的charset一致.
3. 显示到页面的数据变乱码,还是老问题,页面的charset跟数据编码不一致,为了能让显示结果正确可以用
mysql_query("SET NAMES 'gbk'");
这样可以处理中文乱码问题,但这个做法并不是一个明智的选择,如果页面同时有用AJAX的话,细节请看4.
4. AJAX乱码,AJAX默认是以utf-8格式收发文本.这就意味着如果你页面header的charset不是utf-8的话,恭喜你要抓破头皮了...
思路分2步:
(1) 在客户端发请求前把文本encode,在服务器端再decode,然后存到数据库
(2) 从服务器端返回前先把文本转成utf8格式,可以用mysql_query("SET NAMES 'utf8'");
当然在客户端也可以不管3721什么格式,直接用utf-8格式发送到服务器,再在服务器转utf-8,有以下这个方法专门处理这个的:
$str = iconv("UTF-8","gbk",$inputData);//返回把inputdata格式从gbk转成utf-8后的字符串
到这里似乎也不没抓破头皮啊...,但你不要忘记了,页面的charset并不是utf-8,所以mysql_query("SET NAMES 'utf8'");是不能随便用的,不然你顾得了AJAX,原来页面直接取的数据又乱了...
这样就得要用独立的函数来做数据库mysql_connect,如果之前对mysql_connect的相关逻辑封装的东西太多,不好拆分,那你继续抓头发吧...以后洗头省点洗发水.
总结:最简单的方法,前后台都用同一种编码:utf-8.
文件编码用utf-8,数据库/表/列也utf-8,最后别忘记了header的charset也utf-8一下,用了utf-8你会觉得天空是多么晴朗,世界是多么的美好...

