乱码笔记

在开发Graceric Version 2的过程中详细的研究了一下PHP页面中文乱码的问题,所以这篇文章的名字就叫做:乱码笔记。

1) 数据库Collation的中文乱码问题

PHP页面要从数据库取数据到前台显示,或者把输入传到数据库中保存,整个过程中可能有四个编码环节:
a) 页面文件的编码 b) 页面的编码 c) 数据库连接的character-set d) 数据库表的collation

a) 页面文件的编码: PHP文件是用什么编码保存的(比如utf-8, unicode, 或者中文系统默认的GB2312)。这个和数据库数据无直接联系,传到数据库的数据的编码只和页面的编码统一,但建议文件编码和页面编码一致。
b) 页面的编码: html的head中的 content="text/html; charset=XXX", XXX即页面编码。
c) 数据库连接的character-set: 可以在MySQL的配置my.ini中配置,一般写法是default-character-set=utf8,默认的charset是latin1,也可在执行SQL前用SET NAMES 'utf8'语句来指定。
d) 数据库表的collation: 在建数据库或者表的时候指定,phpMyAdmin可以先选择表,然后点‘Operations’进行修改。

总之,要正常显示简体中文这些编码一般必须是utf-8或者gb2312,而且四者需要一致。不过呢,数据库连接可以将utf-8隐式的转换为gb2312,反之则不然。

2) xajax的中文乱码问题 

经验总结,摸索出来的一点结果:

a) 当页面文件使用gb2312编码,使用xajax中用form onsubmit的方式来触发ajax函数,不论页面使用utf-8或者gb2312编码,都需要调用
iconv('utf-8', 'gb2312//IGNORE', $string)  来转换输入的中文字符,然后拼数据查询语句。
b) 通过其他方式触发ajax函数,只有当页面使用gb2312编码,需要调用
iconv('utf-8', 'gb2312//IGNORE', $string)  来转换输入的中文字符,然后拼数据查询语句。
c) 当页面使用gb2312编码,使用utf-8编码数据库表的数据库查询前,需先执行:
query("SET NAMES 'gb2312'") 使得数据库连接完成从utf-8到gb2312的隐式转换。
d) 当页面和页面文件都用utf-8编码,则没有任何问题,无需转换。

总之:xajax的中文参数总是在完成转换到utf-8编码后进行传递,故非utf-8中文操作需转换到与页面及页面文件的相同的编码中进行。

3) 页面编码和文件编码不统一的中文乱码问题

即如果页面用utf-8编码,PHP文件用的是gb2312保存,那么写死在文件中的中文字符输出成为乱码。

解决是:在输出中文字符前用iconv函数转换。或者将所有中文字符从数据库中取,文件中只写英文。

4) Zend Studio的中文乱码问题

Zend其实5.0的时候就已经很好的支持中文了,不过设置比较奇怪的说:

a) Tools -> Preferences

b) Desktop tab -> encoding 选择 utf-8 或者gb2312

c) Colors and fonts tab -> 点击Schema Name新建一个,Editor Font选择NSimSun

d) 文件保存时选择与encoding相同的编码