编码问题简单收集
每一个二进制位(bit)有0和1两种状态,八个二进制位被称为一个字节(byte);因此一个字节可以组合出256个状态,即对应256个字符;
ASCII:
ASCII码一共规定了128个字符的编码;只占用了一个字节的后面7位,最前面的1位统一规定为0;
GB2312:
GB2312对ASCII简体字扩展;两个字节表示一个汉字,可以表示256x256=65536个符号。后更新出gbk,gb18030,即gb系列;
big5:
big5对ASCII繁体字扩展;
Unicode:
Unicode是一个很大的集合,现在的规模可以容纳100多万个符号,达到4个字节;太过庞大这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍。
UTF-8:
UTF-8是Unicode的实现方式之一;UTF-8它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
ANSI:
ANSI是默认的编码方式。对于英文文件是ASCII编码,对于简体中文文件是GB2312编码
URL编码:
URL编码结果依赖你使用的”方法“,最终将URL转换为有效的ASCII字符格式。每一个非安全的ASCII字符都被替换为“%hh”格式,其中hh为两位十六进制数,它对应于该字符在ISO-8859-1字符集里的编码值。URL字符串里不能含有空格,在进行URL编码时,空格全部被替换为加号(+)。
所以相同汉字有N多种URL编码结果,URL的utf8编码为3个字节对应一个汉字,gbk编码为两个字节对应一个汉字。
1、网址路径的编码,用的是utf-8编码;
2、参数的编码,用的是操作系统的默认编码(一般为utf-8)。
3、GET和POST方法的编码,用的是网页的编码。
4、在Ajax调用中,IE总是采用GB2312编码(操作系统的默认编码),而Firefox总是采用utf-8编码。
在javascript里的URL编码函数:
escape&unescape:
javascript的Unicode编码&解码
var unicode = function(s){ return s.replace(/[\u4E00-\u9FA5]/ig,function(w){ return escape(w).toLowerCase().replace(/%/ig,'\\'); }); };
encodeURI&decodeURI
javascript的utf-8编码
encodeURIComponent&decodeURIComponent
javascript的utf-8编码,包括encodeURI编码字符;
浏览器识别编码顺序是
1,http头中的Content-Type
2,html页面中的meta标签中指定charset
3,页面正文数据(浏览器可以解析正文二进制码来判断编码)
避免编码问题可以采取的方法
1、使用js的encodeURI方法将汉字进行UTF-8的URL编码;服务器端再将其转码;
php处理:
iconv("UTF-8", "gbk", htmlspecialchars($__GET["name"], ENT_QUOTES));
2、使用js的escape方法将汉字进行unicode编码;服务器端处理转码
php:json_decode ( string $json [, bool $assoc ] );对 JSON 格式的字符串进行编码,返回json对象;可以针对unicode进行解码;
详细参考:
http://ued.taobao.com/blog/2011/08/26/encode-war/
http://www.ruanyifeng.com/blog/2010/02/url_encoding.html
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html