PHP乱码问题,很多地方都会出现,让我们从入门级别谈起吧。

新手开始学PHP的时候,经常问:为什么数据库插入的数据是乱码? 这个问题解决很简单也很经典:就是保持数据库读、写、页面输出编码一致。MYSQL方面就是mysql_query(“set names XXX”) ,并且一定要放在执行SQL查询前面运行,所以一般是写在选择数据库后运行。(注意的是UTF-8编码在set names这里写作utf8)。至于页面编码,看你的HTML页面编码定义修改。

为什么我截取字符串会出现乱码?

这个问题也经常遇到,一般是用substr函数直接截取的结果。注意的一点是,中文一般是占两个字节,但是有些时候(utf-8编码下)会占到3个字节。你如果要你的系统里面用substr直接截取中文,大多数情况是会出现乱码的,解决方法是写个基于substr函数的截取字符串函数(各个开源系统都有类似的,有心的人可以自己查)。

为什么我写的XML文件里面是乱码?

同理,XML写入的时候,只需要字符编码保持一致。比如你是GBK的页面,编码是GBK,那么你定义的XML文件编码也需要时GBK的,插入的数据也是GBK的。保持一致就可以了。

为什么AJAX传递过来的数据是乱码?

很正常,AJAX只支持utf-8编码,所以你用别的编码,在AJAX函数中最好将数据转换下,换成UTF-8,然后接收过来再换成原编码。

为什么使用AJAX弹出的框框有乱码?

这个问题一般是因为你的框框页面没有定义编码,解决方案: 1是在框框模板文件里面添加编码定义,2是PHP页面发送编码过去(header函数应该都会吧).

为什么我用正则过滤/替换某些关键字(汉字)后会出现乱码?

同理,正则替换中文编码真正管用的只是UTF-8编码,你如果用GBK或者GB2312的编码,使用正则替换汉字的时候,总有些时候不会正常替换而出现编码。(DISCUZ大名鼎鼎的discuzcode函数都有该BUG,在UTF-8编码下看不出来的)解决方案:有此类情况的时候,先将编码换成UTF-8,等正则运行后再转换成原编码。

应该还有其他乱码情况,上面的只是一部分。其实乱码问题核心还在于UTF-8编码和其他编码的差异。可以说,UTF-8是电脑认的编码,GBK和GB2312是给用户看的编码。站在程序员角度,统一用UTF-8编码是最好的,省掉了不少事情。但是一般的网站,不会为了页面显示效果而选用UTF-8的。当你遇见莫名其妙的乱码问题的时候,试着换下编码看看吧!