编写Ajax时发现浏览器显示乱码,细究,发现与encodeURIComponent函数有关。
javascript中有6个和编码有关的内置函数分别是:
escape,unescape,encodeURI,decodeURI,encodeURIComponent,decodeURIComponent
escape(javascript1.0)编码空格、标点符号及其它不位于 ASCII 字母表的字符,除了以下字符: * @ - _ + . / (NN编码@)
encodeURI(javascript1.5)先将字符转化为UTF-8然后再编码,不会被此方法编码的字符:! @ # $ & * ( ) = : / ; ? + ' , - _ .
encodeURIComponent(javascript1.5)先将字符转换为UTF-8然后再编码,不会被此方法编码的字符:! * ( ) . ' - _
所以用XMLHttpRequest传送经过encodeURI或者encodeURICompnent转换后的内容会变为UTF-8编码后传给服务器,服务器接受的是UTF-8编码过的内容,如果在将它显示在Content-Type: text/html;charset=gb2312的页面中就会出现乱码了。
要消除乱码,第一当然可以不用encodeURI或 encodeURICompnent函数而采用escape函数,然后将XMLHttpRequest传回来的内容再经过unescape转换就可以了,但是这种办法并不被推荐,因为它不能对“统一资源标识符(URI)”进行编码。第二个办法是采用encodeURI或 encodeURIComponent函数,但是要将转换为UTF-8编码的内容再重新转换为gb2312或gbk,可以在客户端转换也可以在服务端转换。在网上搜了一下各户端转换办法,发现用vb是常用的办法,但是,显然这种办法很不合适(仅IE支持)。
在服务器转换是个不错的办法,用php只要使用mb_convert_encoding函数就可以搞定(需要加在mbstring库)
例如将POST的内容从UTF-8转换为GBK并输出:echo mb_convert_encoding($ _POST["name"],"gbk","utf8");
当然最好的办法是整个网站均采用UTF-8编码,这样就不需要转换代码了,
网站中涉及编码的地方:
Content-Type: text/html;charset=gb2312 charset设置了浏览器将采用什么编码来解释接受的内容
源代码(包括纯静态网页):源代码采用什么编码进行编辑是比较重要的,一般要和Content-Type一致,这样才不至于冲突而出现乱码(在windows记事本保存时有ANSI,UTF-8,Unicode,Unicode big endian编码选项)
php.ini:设置default-charset选项,这样在Content-Type:缺失或没有指定charset时可以加上去
数据库。
整站采用UTF-8字符编码是不错的选择,这样的话少了编码转换的麻烦,而且UTF-8采用unicode字符集,支持几乎所有的语言,这样对于不支持GBK或者GB2312字符集的操作系统的浏览者(但需支持unicode)也不会带来不便。
有一点就是UTF-8比ANSI占空间,不过多出空间不大(文本文件相对于多媒体文件还是比较小的),完全可以接受。
javascript中有6个和编码有关的内置函数分别是:
escape,unescape,encodeURI,decodeURI,encodeURIComponent,decodeURIComponent
escape(javascript1.0)编码空格、标点符号及其它不位于 ASCII 字母表的字符,除了以下字符: * @ - _ + . / (NN编码@)
encodeURI(javascript1.5)先将字符转化为UTF-8然后再编码,不会被此方法编码的字符:! @ # $ & * ( ) = : / ; ? + ' , - _ .
encodeURIComponent(javascript1.5)先将字符转换为UTF-8然后再编码,不会被此方法编码的字符:! * ( ) . ' - _
所以用XMLHttpRequest传送经过encodeURI或者encodeURICompnent转换后的内容会变为UTF-8编码后传给服务器,服务器接受的是UTF-8编码过的内容,如果在将它显示在Content-Type: text/html;charset=gb2312的页面中就会出现乱码了。
要消除乱码,第一当然可以不用encodeURI或 encodeURICompnent函数而采用escape函数,然后将XMLHttpRequest传回来的内容再经过unescape转换就可以了,但是这种办法并不被推荐,因为它不能对“统一资源标识符(URI)”进行编码。第二个办法是采用encodeURI或 encodeURIComponent函数,但是要将转换为UTF-8编码的内容再重新转换为gb2312或gbk,可以在客户端转换也可以在服务端转换。在网上搜了一下各户端转换办法,发现用vb是常用的办法,但是,显然这种办法很不合适(仅IE支持)。
在服务器转换是个不错的办法,用php只要使用mb_convert_encoding函数就可以搞定(需要加在mbstring库)
例如将POST的内容从UTF-8转换为GBK并输出:echo mb_convert_encoding($ _POST["name"],"gbk","utf8");
当然最好的办法是整个网站均采用UTF-8编码,这样就不需要转换代码了,
网站中涉及编码的地方:
Content-Type: text/html;charset=gb2312 charset设置了浏览器将采用什么编码来解释接受的内容
源代码(包括纯静态网页):源代码采用什么编码进行编辑是比较重要的,一般要和Content-Type一致,这样才不至于冲突而出现乱码(在windows记事本保存时有ANSI,UTF-8,Unicode,Unicode big endian编码选项)
php.ini:设置default-charset选项,这样在Content-Type:缺失或没有指定charset时可以加上去
数据库。
整站采用UTF-8字符编码是不错的选择,这样的话少了编码转换的麻烦,而且UTF-8采用unicode字符集,支持几乎所有的语言,这样对于不支持GBK或者GB2312字符集的操作系统的浏览者(但需支持unicode)也不会带来不便。
有一点就是UTF-8比ANSI占空间,不过多出空间不大(文本文件相对于多媒体文件还是比较小的),完全可以接受。
回复Comments
{commenttime}{commentauthor}
{CommentUrl}
{commentcontent}