关于编码
编码问题是在编程中经常见到的一个问题.
最开始,计算机是由美国人发明的,因此,最开始的编码方式是采用ASCII编码.随着时代的发展,很多国家也慢慢的开始接触计算机,接触互联网,例如中文这么多的汉字, ASCII编码是完全不够用的,一次中国制定了GB2312编码,用来把中文编进去.那么问题来了,全世界这么多的语言,日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里,各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。
这可怎么办呢?
(国际标谁化组织)的国际组织决定着手解决这个问题。他们采用的方法很简单:废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和符号
的编码!他们打算叫它”Universal Multiple-Octet Coded Character Set”,简称 UCS, 俗称 “unicode“。
因此,我们可以明白的是:
为了将所有国家的语言进行统一化,而不会出现各种版本,Unicode所有的字符都使用两个字节 .
ASCII是1个字节,Unicode是两个字节
那么又出现问题了,加入一篇文章都是用英文写的话,两个字节例如'A',它的Unicode编码为00000000 01000001
,Unicode比ASCII多了一倍的存储空间,存储和传输上是很大的浪费.
那么'UTF-8'诞生了!!!
UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间.
为了不造成字节上的浪费,出现了UTF-8,从unicode到uft-8并不是直接的对应,而是要过一些算法和规则来转换。
字符 | ASCII | Unicode | UTF-8 |
---|---|---|---|
A | 01000001 | 00000000 01000001 | 01000001 |
中 | 01000001 | 01001110 00101101 | 11100100 10111000 10101101 |
进制 | 二进制 | 十六进制 | 二进制 |
URL编码
URL编码的混乱...
- 网址路径的编码,用的是utf-8编码(浏览器发出HTTP请求)
- 查询字符串的编码,用的是操作系统的默认编码(浏览器发出HTTP请求)
- GET和POST方法的编码,用的是网页的编码(浏览器发出HTTP请求)
- 在Ajax调用中,IE总是采用GB2312编码(操作系统的默认编码),而Firefox总是采用utf-8编码(Javascript生成HTTP请求)
如何解决Javascript生成HTTP请求?
- encodeURI()
encodeURI()是Javascript中真正用来对URL编码的函数
它对应的解码函数是decodeURI()
- encodeURIComponent()
最后一个Javascript编码函数是encodeURIComponent().与encodeURI()的区别是,它用于对URL的组成部分进行个别编码,而不用于对整个URL进行编码.
因此,"; / ? : @ & = + $ , #",这些在encodeURI()中不被编码的符号,在encodeURIComponent()中统统会被编码.至于具体的编码方法,两者是一样.
它对应的解码函数是decodeURIComponent()。
参考自:
阮一峰:http://www.ruanyifeng.com/blog/2010/02/url_encoding.html
廖雪峰:http://www.liaoxuefeng.com/
知乎:https://www.zhihu.com/question/23374078