Ajax+PHP的编码问题总结
我晕。。。。。。。。。。
弄了一天,总算把Ajax+PHP的编码问题弄清楚了。。。。。。。。。。
总结一下吧,省的忘了-------
1、Html被浏览器用什么字符打开,由下面两种情况:
(1)<meta http-equiv="Content-Type" content="text/html; charset=gbk" />
这样就告诉了浏览器用gbk打开,如果你的html里面由utf-8的中文,则显示乱码
(2)没有用<meta charset />指明编码,则你的html文件是用什么编码写的,就用什么编码打开!
2、浏览器遇到PHP文件,用什么字符显示,也有下面两种情况:
(1)header('Content-Type:text/html;charset=utf-8');---则告诉你的浏览器用utf-8显示
如果你的php文件是用GBK写的,且里面有中文要显示,则乱码。
(2)如果没有header指定编码,则由php.ini中的default-charset指定的编码显示
3、Ajax与PHP文件的交互:
(1)发送---不管js是由GBK还是UTF-8写的,里面的中文传到PHP后,都变成了正确UTF-8编码的中文[注意,不是乱码哦!]
(2)接收---不管js,php,php.ini的编码如何,也不管是什么浏览器......
只要PHP文件加上了header('Content-Type:text/html;charset=utf-8');
而且echo的中文都是正确的UTF-8编码,则肯定OK!
(3)实现(2)的方法及注意事项---------
[1]假如PHP为GBK编码,想往JS传中文"哈哈",方法----$message = iconv("gbk","utf-8","哈哈"); echo $message;
[2]假如PHP为GBK编码,想先存入数据库(utf-8),然后再取出传回JS,方法-$message = iconv("gbk","utf-8","哈哈")
(注:有时会用到这个函数---mysql_query("SET NAMES 'UTF8'");作用---告诉数据库,"我传给你的将是一段X编码的数据,请按 X编码理解","你传给我的数据也必须翻译成X编码的,我只懂X编码")
[3]// $message = strip_tags($message); // $message = htmlentities($message, ENT_QUOTES);
这两个讨厌的函数,会使$message变成乱码,具体为什么暂时还没查阅!!!
4、总结:
(1)如果服务器是UTF-8编码,建议HTML,JS,PHP,MYSQL均用UTF-8写,这样什么都不用管,就OK!
(2)如果服务器是GBK编码,建议HTML,JS,PHP用GBK编写,MYSQL还是用UTF-8,
[1]需要PHP传中文到--->JS时,方法:header(..."utf-8"),且传的中文都用iconv函数处理!
[2]需要PHP存中文到数据库时,方法:插入的中文用iconv函数处理之后再insert...
5、补充:
(1)我假设,这里有一个PHP函数能正确实现JS里的unescape的功能!
现在有一个gb2312格式的HTML页面,其中的数据escape后经过ajax传到后台PHP页面中
php unescape处理后 数据变成了什么格式? [后台为gb2312]
如果前台不做escape处理,后台也不做 unescape处理呢? [后台为UTF-8]
注:The escape() function encodes a string, so it can be read on all computers.
escape()方法将字符串转换为特定的编码,使其能够被任意的计算机识别和读取。
实例---
In this example we use escape() to encode strings:
在下面的例子中我们用escape()来加密字符串:
<script type="text/javascript">document.write(escape("欢迎来到POP") + "<br />")document.write(escape("?!=()#%&"))</script>
The output of the code above will be:
输出结果为:
Visit%20W3Schools%21%3F%21%3D%28%29%23%25%26
----------------------------------------------------------------------------------------------------------------------------
(2)mb系列函数:
php5汉字处理和字符串处理编码模式不同
例如,当我们使用strlen 这个函数 获得汉字的长度的时候 例如这个汉字串“我爱中国”
那么它返回的将是8个,而不是4个当我们希望得到4个的时候,我们就必须借用加前缀的mb_函数了
他的意思是多字节字符处理函数,此类函数的参数的最后一参数为,编码模式,有默认值,但我们要用
“Gb2312”,此编码模式,正确解析汉字;
实例:
mb_strlen($txt,"GB2312 ")
function indexOf($sorce,$chinese) {
return ( @mb_strpos($sorce,$chinese,null,"GB2312") );
}
function charAt($sorce,$numpos) {
return ( mb_substr($sorce,$numpos,1,"Big5") );
}
function charAt($sorce,$numpos) {
return ( mb_substr($sorce,$numpos,1,"Big5") );
}