最近遇到了ajax 中文乱码的问题。下面总结一下
1. HTTP协议的编码规定
在HTTP协议中,浏览器不能向服务器直接传递某些特殊字符,必须是这些字符进行URL编码后再进行传送。url编码遵循的规则: 将空格转换为(+) 对0-9,a-z,A-Z之间的字符保持不变。
对于所有其他的字符,用这个字符的当前字符集编码在内存中的十六进制格式表示,并在每个十六进制字节前加上一个百分号%。例如,字符“+”用%2B表示,字符“=”用%3D表示,字符“&”用%26表示,
字符“国”用%B9%FA表示注意,同一个中文字符在不同的字符集编码方式下,在内存中的编码值也是不同的,一个字符的URL编码是针对字符在内存中的码值而言的,采用不同编码的同一个字符的URL编码结果是不同的。
2. encodeURI()与encodeURIComponent()函数
javaScript中提供了两个函数来对字符进行URL编码:encodeURI()与encodeURIComponent(),两者的区别在于,encodeURI函数不会对以下的字符进行处理:“! @ # $ & * ( ) = : / ; ? + ' ”,
而encodeURIComponent函数会对更多的字符进行处理比如 URI的组成部分 “/” 就会被encodeURIComponent进行处理。这两个方法对传递的值进行URL编码,
过程是先找到字符所对应的UTF-8编码,比如“张三”两个字的UTF-8编码是”0xE5BCA0E4B889”(前面的是零x,表示是16进制编码).“张”是”0xE5BCA0”,”三”是”0xE4B889”,那么被转换后的结
果就 是”%E5%BC%A0%E4%B8%89”,注意这个转换结果与网页的编码没有任何关系,因为这两个函数总是拿到字符所对应的UTF-8码,然后再进行URL编码的。也就是说不管网页是GBK的编码还是UTF-8的编码,
转换的结果都一样。 所以如果我们发送给服务器的请求包含有中文或者其它比较特殊的字符如空格“+”等符号的时候,就就需要使用者两个函数对字符进行URL编码。
如果编码是 html和服务器端都是utf-8 话 是不需要进行处理的,也就是说不会出现乱码问题。
我的页面用的是gbk编码 我接收值得时候用 encodeURIComponent 函数传值,在服务器端 我用的是php 我的解决办法是
$name = urldecode("$_GET['name']");//首先进行解析
iconv('utf-8', 'gbk', $name);//然后进行转码