1.提到编码,首先需要认识神马是编码,有几种编码方式。
- 神马是编码:说白了,编码就是一种信息转化成另一种信息(必然是计算机可以识别的)。百度知道:编码是信息从一种形式转化成为另一种形式的过程(也称:计算机编程语言的代码,简称编码)。有编码自然就有解码,解码奏是编码的逆过程。
- 编码的方式(常见):ASCII、GB2312、UTF-16、UTF-32、UTF-8、GB2312等等。编码的最终目的:计算机只能识别0与1,so所有的编码方式最终的目的都是将信息转化成为一个计算机可以识别的二进制字符串,大学的计算机组成原理讲过一个byte(字节)由8位bit组成,从00000000到11111111就有256种组成方式,so一个字节有256种。
- ASCII编码:英语字符向二进制进行编码,ASCII一共规定了128个字符的编码,00000000~01111111共128种。
- 非ASCII编码:世界上的语言有太多种,一个二进制编码会对应多中语言,这就会导致生成很多编码规范,即非ASCII编码。
- Unicode规范:我们知道,IO流在对文件处理的时候一定是通过编码将二进制字符串转化成目标字符,如果不清楚编码规范就会生成乱码,比如:用ASCII编码方式生成汉语,这样就会出现乱码。那么如果存在一种适用于所有语言的编码方式就会解决这个问题,这种编码方式就是Unicode规范,这种Unicode规范可以理解成世界一个字符簇,世界上所有的字符都在这个Unicode中。
- UTF-X编码:互联网时代的到来,对编码方式的要求更明显,互联网是普及全世界的,因而必须要有一种适应所有语言的编码方式,正是这种需求使得Unicode规范正式被采用。Unicode本身就是为了囊括世界上所有的语言,任何一个字符在Unicode中都对应了一个值,这个值就叫做代码点,代码点的值通常写成U+XXXX,文字与代码点之间的关系就是UCS-2,UCS-2是由两个byte(字节)来表示代码点,范围是U+0000~U+FFFF。还有UCS-4由4个字节表示一个代码点,范围是U+00000000~U+7FFFFFFF。UCS只是表示字节与代码点之间的关系,并没有规定代码点在计算机中的储存方式。我们总说UTF-8编码,那么这个UTF是啥捏~UTF就是规定储存的方式,其中比较多的就是UTF-8、UTF-16。
- UTF-16:UTF-16对应的就是UCS-2,是由两个字节组成一个代码点(可以理解为字符),UTF-16的缺点就是它的固定长度,固定了两个字节使得一个简单的字符占据了两个字节的内存(浪费),UTF-16的优点必然也是他的固定长度,因为内存对应硬件的总线,每个总线走1bit,固定的长度效率高,所以UTF-16适合内存的计算,so在C#、数据库等等用的都是UTF-16编码方式。
- UTF-8:为了解决UTF-16的固定长度问题UTF-8就诞生了。UTF-8是可变长度,由1~4个字节来表示代码点,可变的长度使得UTF-8在节省内存上更占优势,更适宜于传输。
2.什么是编码以及常见的几种编码方式已经大概的阐述了,下面我们就研究一下JavaScript中的几种编码方式吧。
- 在研究编码方式之前,我们要知道为什么要对URL编码?编码后以什么形式呈现出来?url的结构(https://www.cnblogs.com/dqhan.aspx?opt=1&name=dqhan由协议+域名+参数),向服务器发出请求时,url中的参数都是以key、value这样的键值对形式存在,服务器会通过&符号(打个比方)分割参数。那么问题来了,当name=dq&han这样的参数存在的时候肿么办,在解析参数的时候自然会出现分割错误,这个时候对URL的编码就出现了。通过UTF-8方式将&转化成一个16进制的数,即0xXX,0x用%取代,这样呈现出来的就是%XX(XX为16进制的数字)。
- (1)escape()与unescape()、(2)encodeURI()与decodeURI()、(3)encodeURIComponent()与decodeURIComponent():escape、encodeURI、encodeURIComponent三种方式均为编码字符串,unescape、decodeURI、decodeURIComponent反编码,使已经被编码的字符串变回原来的状态。
- escape不编码字符有69个:*,+,-,.,/,@,_,0-9,a-z,A-Z
- encodeURI不编码字符有82个:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z
- encodeURIComponent不编码字符有71个:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z
- 总结:在2与3中,encodeURIComponent会比encodeURI多编码;/?:@&=+$,#等11个字符,这些符号通常用URL分割符,所以在encodeURI的目的常用语对URI进行整体编码应用场景可以为前后台通信中。例如Ajax,对url进行encodeURI编码可以防止url不会被解析成为乱码(在没有encodeURI时,url会以浏览器的编码格式提交,这常常是由操作系统来决定,在不同浏览器中会出现乱码的可能)、encodeURIComponent常用分割URI组件,更适于页面跳转过程中获取参数、防止参数被破坏通过encodeURIComponent编码在另一个页面decodeURIComponent反编码,至于escape百度说ECMAScript v3 反对使用该方法,所以不介意使用,此方法更多的目的就是单纯的返回一个Unicode编码值。
3.实例:
- encodeURI:
var str1 = encodeURI('https://www.cnblogs.com/dqhan.aspx?name1=dqhan1&name2=dqhan2') str1: "https://www.cnblogs.com/dqhan.aspx?name1=dqhan1&name2=dqhan2"
- decodeURIComponent
var str2 = encodeURIComponent('https://www.cnblogs.com/dqhan.aspx?name1=dqhan1&name2=dqhan2');
str2: "https%3A%2F%2Fwww.cnblogs.com%2Fdqhan.aspx%3Fname1%3Ddqhan1%26name2%3Ddqhan2"
- escape
var str3 = escape('https://www.cnblogs.com/dqhan.aspx?name1=dqhan1&name2=dqhan2'); str3: "https%3A//www.cnblogs.com/dqhan.aspx%3Fname1%3Ddqhan1%26name2%3Ddqhan2"