字符编码

#编码 #unicode #UTF8

字符编码

简介

unicode包含了世界上所有的字符。 gb2123只有中文字符,GBK是它的升级版。 UTF8 UTF-16 UTF-24是Unicode的实现方式(或者传输方式|存储方式)。 浏览器的URL编码是UTF-8,url中的参数编码是跟随系统编码,通常也是UTF-8。例如"q=%E6%98%A5%E8%8A%82",是字符的UTF8编码,每个字符前面加上“%”。 在javascript中,escape()得到的是unicode编码。encodeURI()方法得到的是utf-8编码。 URL只支持ASCII编码,所以URL中的字符必须编码。

URL编码

URL中不支持特殊符号,也为了防止=&这样的符号造成奇异,需要为query键值对进行编码。 URL中只允许存在字母数字和-_.~这4个符号,还有一些保留字符。

! * ' ( ) ; : @ & = + $ , / ? # [ ]

URL只支持ASCII编码,所以URL中的字符必须编码。 标准ASCII编码有128个字符。 对于Unicode字符,RFC文档建议使用utf-8对其进行编码得到相应的字节,然后对每个字节执行百分号编码。关于encodeURI使用的还是UTF-8,并不会受到页面字符集的影响。 安全字符不需要被编码。编码要做的是把不安全字符用安全字符表示;另外,当安全字符作为值出现时,也需要编码。

js提供了3中编码的方式。

  • escape(69个):*/@+-._0-9a-zA-Z
  • encodeURI(82个):!#$&’()*+,/:;=?@-._~0-9a-zA-Z
  • encodeURIComponent(71个):!’()*-._~0-9a-zA-Z

通常使用第2个和第3个。 encodeURI用于整个URI的编码。它的安全字符更多,可以使用;#&$这样的字符; encodeURIComponent用于URI中单个组件的编码。他的安全字符较少。例如对query中的value进行编码,如果value中包含了"&",那么"&“就会变编码。

ISO-8859-1

单字节编码,兼容ASCII,是JAVA网络传输使用的标准字符集

urlEncode原理

url只能显示ascii支持的字符. 为了显示其他非ascii字符, 需要根据unicode字符集, 使用某一种编码方式(如UTF-8) 对字符进行编码, 并在编码结果的每个十六进制数字前面加上%.

如: 汉字"中"
在unicode中的顺序为20013
10进制 20013   
十六进制    4      e     2     d 
二进制     0100  1110  0010  1101
utf8模版 1110XXXX  10XXXXXX 10XXXXXX
utf8分割   0100    111000   101101
utf8编码  11100100 10111000 10101101
utf8 16进制  e4    b8     ad
结果 %e4%b8%ad

注意:在互联网上的大部分"在线utf8转中文"的工具, 给出的不是utf8编码, 而是unicode编码的16进制.

javascript

str.charCodeAt(0) 可以获得字符串str的第0个字符在unicode中的位置. escape 把非ascii字符,根据unicode字符集,转为unicode编码的16进制, 并在编码前面加上%u unescape 与escape相反 encodeURI 与上述"urlEncode原理"相同

base64编码

注意:与base64进制转换区分开. base64编码需要使用到base64进制转换. base64: 把二进制数字用base64字符表示. base64进制转换: 把数字用base64字符表示. base64字符集: 先把字符转为二进制, 然后每24位转为32位, 再用64进制表示.

把字符转为"base64字符表"中的字符. 本质是把每24位, 转为32位; 即每6位前补2位00, 转为8位, 得到新的数字, 再用base64字符集表示. base64编码不是对字符串的编码转换, 而是对byte数组的. 所以在转换前,需要把字符串使用你使用的字符集的编码方式, 转为byte数组.

通常base64字符集为A-Z, a-z, 0-9, +, /, =. 但是也有一些变种, 如A-Z, a-z, 0-9, -, _, =. 当字符串长度不足24位时, 用0补位, =就用于表示00000000, 使得转换后的字符串长度为4的倍数. base64不是url安全的, 因为包含了/和+等字符. 但是可以使用urlEncode对base64编码后的字符串进行编码, 使其变为url安全的. 或者把/+替换为其他字符,进行base64.

picture 1
picture 2