1、字符
定义:字符是各种文字和符号的总称;即一个字符可以是一个汉字、一个字母、一个阿拉伯数字、一个标点符号等;字符是数据结构中最小的数据存取单位;
2、字符集
定义:字符集是多个字符的集合,比如GB2312是中国国家标准的简体中文字符集,常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等;
3、字符编码
定义:把字符集中的字符编码成特定集合中的某一对象的方式(映射),以便文本在计算机中存储和通过通信网络中传递;
4、字符集和字符编码的关系
字符集是字母、符号等字符的集合,而字符编码指的将字符转化为某一特定的字节或字节序列,是一种规则;通常特定的字符集采用特定的编码方式,各个国家和地区在制定编码标准的时候,“字符集合”和“字符编码”一般都是同时制定的。所以像ASCII字符集合一样,它也同时代表了一种字符的编码。(即一种字符集对应一种字符编码,例如ASCII、IOS-8859-1、GB2312、GBK等,都是即表示字符集又表示了对应的字符编码,但Unicode不是(有utf-8,utf-16,utf-32这些字符编码))
5、编码与解码
电脑只能处理01010101这样的二进制数字,字符是我们日常生活中使用的符号,为了使电脑可以存储普、传输和展示字符,我要需要将字符转为01010101这样的二进制数,转化的规则称之为编码;
相反,把01010101这样的二进制码转换为字符的过程就是解码。<br />至于把哪个字符映射到哪个二进制串上,是由国家(国家标准)、国际组织(国际标准)等来决定的。<br /> ** 但一般不用二进制串来表示字符的编码(看和阅读都很困难),而是用十六进制的串来表示某个字符的编码**。
6、关于url编码
我们都知道Http协议中参数的传输是”key=value”这种简直对形式的,如果要传多个参数就需要用“&”符号对键值对进行分割。如”?name1=value1&name2=value2”,这样在服务端在收到这种字符串的时候,会用“&”分割出每一个参数,然后再用“=”来分割出参数值。
针对“name1=value1&name2=value2”我们来说一下客户端到服务端的概念上解析过程:
上述字符串在计算机中用ASCII吗表示为:
6E616D6531 3D 76616C756531 26 6E616D6532 3D 76616C756532。
6E616D6531:name1
3D:=
76616C756531:value1
26:&
6E616D6532:name2
3D:=
76616C756532:value2
服务端在接收到该数据后就可以遍历该字节流,首先一个字节一个字节的吃,当吃到3D这字节后,服务端就知道前面吃得字节表示一个key,再想后吃,如果遇到26,说明从刚才吃的3D到26子节之间的是上一个key的value,以此类推就可以解析出客户端传过来的参数。
现在有这样一个问题,如果我的参数值中就包含=或&这种特殊字符的时候该怎么办。
比如说“name1=value1”,其中value1的值是“va&lu=e1”字符串,那么实际在传输过程中就会变成这样“name1=va&lu=e1”。我们的本意是就只有一个键值对,但是服务端会解析成两个键值对,这样就产生了奇异。
如何解决上述问题带来的歧义呢?解决的办法就是对参数进行URL编码
URL编码只是简单的在特殊字符的各个字节前加上%,例如,我们对上述会产生奇异的字符进行URL编码后结果:“name1=va%26lu%3D”,这样服务端会把紧跟在“%”后的字节当成普通的字节,就是不会把它当成各个参数或键值对的分隔符。
需要注意的是,对于Url中的合法字符,编码和不编码是等价的,但是对于上面提到的这些字符,如果不经过编码,那么它们有可能会造成Url语义的不同。因此对于Url而言,只有普通英文字符和数字,特殊字符$-_.+!*’()还有保留字符,才能出现在未经编码的Url之中。其他字符均需要经过编码之后才能出现在Url中。