PHP脚本文件使用GB2312编码
Chrome浏览器能自动检测到是GBK编码,文件中的中文字符(GB2312编码)能正确显示。
1)POST提交中文字符数据,编码是EUC-CN(GB2312),GET提供中文字符串数据(?s=字符编码),检测到提交过来的数据是UTF-8编码,显示也是乱码(因为使用GBK编码解释UTF-8编码的数据)。
2)AJAX POST提交中文字符数据,编码是UTF-8;AJAX GET提供中文字符串数据,编码是EUC-CN(GB2312)
火狐浏览器测试除了AJAX GET提供中文字符串数据,编码是UTF-8外(尽管JS脚本是使用GB2312编码)其它跟chrome一致。
Safari for Windows测试跟chrome一致。
Opera测试跟chrome一致。
IE 8(win 7捆绑),在GET提供中文字符串数据(?s=字符编码),检测到提交过来的数据是EUC-CN(GB2312),这个跟firefox和chrome和Opera都不一样。其它跟chrome一致。
360安全浏览器(基于IE内核),跟chrome一样。
说明:AJAX的POST提交使用JQuery的$.post方法,在查看请求头时,发现:
Content-Type application/x-www-form-urlencoded; charset=UTF-8
这个字符编码不确定是浏览器添加的还是JQuery添加的,如果是JQuery添加的,那么它还要负责把POST的数据转换成UTF-8编码,所以估计应该是浏览器行为。
从以上比较可以看出,POST提交的数据的编码跟form表单的编码一致,但是GET提交的数据在有中文时一般采用了UTF-8编码,但是IE浏览器视乎不遵守这个规则,高版本的IE估计会遵守规则,不过这个奇葩还是尽量少用或不用。
使用Ajax方法提交数据时,在GET提交数据上,视乎是跟脚本的编码一致的,但是firefox直接无视这个通用规则,它使用UTF-8编码。在POST提交数据上,都一致使用UTF-8编码(没有确认是否是JQuery的行为还是浏览器行为)。
当把脚本改为utf-8编码时,不管是什么方式,提交的数据带中文时都是utf-8编码的,唯独IE例外,IE中(Win 7自带版本),GET和AJAX GET提交的数据都是EUC-CN(GB2312)编码的,360浏览器(IE内核),AJAX GET也是EUC-CN(GB2312)。
最后结论是,珍惜生命,请远离IE。GET提交中文数据,服务端得到数据编码可能不一致,尽管大多数浏览器都使用UTF-8编码(低版本浏览器可能不是)。POST提交的数据时跟form表单编码一致,所以是可控的。AJAX提交数据也有差异性,所以在处理多字节字符时,最好统一使用utf-8编码。
原创文章,转载务必保留出处。
永久链接:http://blog.ifeeline.com/1168.html