编码与解码

重要通知

基本概况

转义字符

-------------------------------------------------
  转义字符             所代表的字符
-------------------------------------------------
  \0                   NULL字符
  \b                   退格符
  \t                   水平制表符
  \n                   换行符
  \v                   垂直制表符
  \f                   换页符
  \r                   回车符
  \"                   双引号
  \'                   单引号
  \\                   反斜杠
-------------------------------------------------

编码与解码函数

encodeURI()

把URI字符串采用UTF-8编码格式转化成escape格式的字符串。不会被此方法编码的字符:! @ # $& * ( ) = : / ; ? + '

async function EncodeURI() {  
  let conent = "|-a@-0-https://-*-www.-b_c-+\/--!#?^&$~{}[],--()=;;。,‘’--、“”-1-\'--";
  let edit = encodeURI(conent);

  console.log(edit);
  //%7C-a@-0-https://-*-www.-b_c-+/--!#?%5E&$~%7B%7D%5B%5D,--()=;%EF%BC%9B%E3%80%82%EF%BC%8C%E2%80%98%E2%80%99--%E3%80%81%E2%80%9C%E2%80%9D-1-'--
  //console.log(decodeURI(edit));  
}

decodeURI()

对 encodeURI()编码的字符串进行编码。


encodeURIComponent()

不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。

async function EncodeURIComponent() {  
  let conent = "|-a@-0-https://-*-www.-b_c-+\/--!#?^&$~{}[],--()=;;。,‘’--、“”-1-\'--";
  let edit = encodeURIComponent(conent);

  console.log(edit);
  //%7C-a%40-0-https%3A%2F%2F-*-www.-b_c-%2B%2F--!%23%3F%5E%26%24~%7B%7D%5B%5D%2C--()%3D%3B%EF%BC%9B%E3%80%82%EF%BC%8C%E2%80%98%E2%80%99--%E3%80%81%E2%80%9C%E2%80%9D-1-'--
  //console.log(decodeURIComponent(edit));  
}

decodeURIComponent()

对encodeURIComponent()编码的字符串进行编码。


escape()

已废弃,不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: * @ - _ + . / 。其他所有的字符都会被转义序列替换。

async function Escape() {  
  let conent = "|-a@-0-https://-*-www.-b_c-+\/--!#?^&$~{}[],--()=;;。,‘’--、“”-1-\'--";
  let edit = escape(conent);

  console.log(edit);
  //%7C-a@-0-https%3A//-*-www.-b_c-+/--%21%23%3F%5E%26%24%7E%7B%7D%5B%5D%2C--%28%29%3D%3B%uFF1B%u3002%uFF0C%u2018%u2019--%u3001%u201C%u201D-1-%27--
  //console.log(unescape(edit));  
}

unescape()

已废弃,对escape()编码的字符串进行编码。


Unicode 编码

Unicode 字符百科:https://unicode-table.com/cn/blocks/open in new window

汉字Unicode编码范围

----------------------------------------------------------------------------------
  字符集	      字数	    Unicode 编码
----------------------------------------------------------------------------------
  基本汉字	    20902字	  4E00-9FA5
  基本汉字补充	 90字	     9FA6-9FFF
  扩展A	       65923400-4DBF
  扩展B	       4272020000-2A6DF
  扩展C	       4153字	    2A700-2B738
  扩展D	       222字	     2B740-2B81D
  扩展E	       5762字	     2B820-2CEA1
  扩展F	       7473字	     2CEB0-2EBE0
  扩展G	       493930000-3134A
  康熙部首	    214字	     2F00-2FD5
  部首扩展	    115字     	2E80-2EF3
  兼容汉字	    477字	     F900-FAD9
  兼容扩展	    542字	     2F800-2FA1D
  PUA(GBK)部件	81字    	 E815-E86F
  部件扩展    	452字	        E400-E5E8
  PUA增补     	207字        	E600-E6CF
  汉字笔画    	36字	        31C0-31E3
  汉字结构    	12字        	2FF0-2FFB
  汉语注音    	433105-312F
  注音扩展     	22字       	31A0-31BA
  〇	         13007
----------------------------------------------------------------------------------

中文汉字编码范围

16进制表示:\u4e00(对应汉字是"一")至\u9fa5(对应汉字是"龥") 对应的十进制:19968至40869

const minValue = 19968, maxValue = 40869;

console.log(new String("一").charCodeAt().toString(16));
console.log(minValue.toString(16));
console.log(maxValue.toString(16));

ASCII编码

ASCII(American Standard Code for Information Interchange,美国信息互换标准代码,ASCⅡ)是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。

  • ASCII编码
    • ASCII 规范:ASCII 码一共定义了 128 个字符,包含了 33 个控制字符(具有某些特殊功能但是无法显示的字符)和 95 个可显示字符。
    • 它由128个字符组成,包括大小写字母、数字0-9、标点符号、非打印字符(换行符、制表符等4个)以及控制字符(退格、响铃等)组成。

ASCII控制字符

----------------------------------------------------------------------------------
  二进制	        十进制	  十六进制	缩写	    可以显示的表示法	名称/意义
----------------------------------------------------------------------------------
  0000 0000	      0	       00	      NUL	      ␀	              空字符(Null)
  0000 0001	      1	       01	      SOH	      ␁	              标题开始
  0000 0010	      2	       02	      STX	      ␂	              本文开始
  0000 0011	      3        03	      ETX	      ␃	              本文结束
  0000 0100	      4	       04	      EOT	      ␄	              传输结束
  0000 0101	      5	       05	      ENQ	      ␅	              请求
  0000 0110	      6	       06	      ACK	      ␆	              确认回应
  0000 0111	      7	       07	      BEL	      ␇	              响铃
  0000 1000	      8	       08	      BS	      ␈	              退格
  0000 1001	      9	       09	      HT	      ␉	              水平定位符号
  0000 1010      	10	     0A	      LF	      ␊	              换行键
  0000 1011      	11	     0B	      VT	      ␋	              垂直定位符号
  0000 1100      	12	     0C	      FF	      ␌	              换页键
  0000 1101      	13	     0D	      CR	      ␍	              归位键
  0000 1110      	14	     0E	      SO	      ␎	              取消变换(Shift out)
  0000 1111	      15	     0F	      SI	      ␏	              启用变换(Shift in)
  0001 0000      	16	     10	      DLE	      ␐	              跳出数据通讯
  0001 0001      	17	     11	      DC1	      ␑	              设备控制一(XON 启用软件速度控制)
  0001 0010      	18	     12	      DC2	      ␒	              设备控制二
  0001 0011      	19	     13	      DC3	      ␓	              设备控制三(XOFF 停用软件速度控制)
  0001 0100	      20	     14	      DC4	      ␔	              设备控制四
  0001 0101	      21	     15	      NAK	      ␕	              确认失败回应
  0001 0110      	22	     16	      SYN	      ␖	              同步用暂停
  0001 0111      	23	     17	      ETB	      ␗	              区块传输结束
  0001 1000	      24	     18	      CAN	      ␘	              取消
  0001 1001      	25	     19	      EM	      ␙	              连接介质中断
  0001 1010	      26	     1A	      SUB	      ␚	              替换
  0001 1011	      27	     1B	      ESC	      ␛	              跳出
  0001 1100	      28       1C	      FS	      ␜	              文件分割符
  0001 1101	      29	     1D	      GS	      ␝	              组群分隔符
  0001 1110	      30	     1E	      RS	      ␞	              记录分隔符
  0001 1111	      31	     1F	      US	      ␟	              单元分隔符
  0010 0000	      32	     20	     (Space)	                   空格
  0111 1111	      127	     7F	      DEL	      ␡	              删除

  0010 0001	      33	    21	!	 
  0010 0010	      34    	22	"	 
  0010 0011	      35    	23	#	 
  0010 0100	      36	    24	$	 
  0010 0101	      37    	25	%	 
  0010 0110	      38	    26	&	 
  0010 0111	      39    	27	'	 
  0010 1000	      40    	28	(	 
  0010 1001	      41    	29	)	 
  0010 1010	      42    	2A	*	 
  0010 1011	      43    	2B	+	 
  0010 1100	      44    	2C	,	 
  0010 1101	      45    	2D	-	 
  0010 1110	      46    	2E	.	 
  0010 1111	      47	    2F	/	 

  0011 0000	      48    	30	0	 
  0011 0001	      49    	31	1	 
  0011 0010	      50    	32	2	 
  0011 0011	      51	    33	3	 
  0011 0100	      52	    34	4	 
  0011 0101	      53    	35	5	 
  0011 0110	      54    	36	6	 
  0011 0111	      55    	37	7	 
  0011 1000	      56    	38	8	 
  0011 1001	      57    	39	9	 

  0011 1010	      58    	3A	:	 
  0011 1011	      59    	3B	;	 
  0011 1100      	60	    3C	<	 
  0011 1101      	61    	3D	=	 
  0011 1110      	62    	3E	>	 
  0011 1111	      63    	3F	?	 
  0100 0000	      64	    40	@	

  0100 0001      	65    	41	A	 
  0100 0010      	66    	42	B	 
  0100 0011      	67	    43	C	 
  0100 0100      	68    	44	D	 
  0100 0101	      69    	45	E	 
  0100 0110	      70    	46	F	 
  0100 0111	      71    	47	G	 
  0100 1000	      72    	48	H	 
  0100 1001	      73    	49	I	 
  0100 1010	      74    	4A	J	 
  0100 1011	      75    	4B	K	 
  0100 1100	      76    	4C	L	 
  0100 1101	      77	    4D	M	 
  0100 1110	      78    	4E	N	 
  0100 1111	      79    	4F	O	 
  0101 0000	      80    	50	P	 
  0101 0001	      81    	51	Q	 
  0101 0010	      82    	52	R	 
  0101 0011	      83    	53	S	 
  0101 0100	      84    	54	T	 
  0101 0101	      85	    55	U	 
  0101 0110	      86	    56	V	 
  0101 0111	      87	    57	W	 
  0101 1000	      88	    58	X	 
  0101 1001	      89    	59	Y	 
  0101 1010	      90    	5A	Z	

  0101 1011	      91    	5B	[	 
  0101 1100	      92    	5C	\	 
  0101 1101	      93    	5D	]	 
  0101 1110      	94    	5E	^	 
  0101 1111	      95    	5F	_	 
  0110 0000      	96    	60	`	 

  0110 0001	      97    	61	a	 
  0110 0010	      98    	62	b	 
  0110 0011      	99    	63	c	 
  0110 0100	      100	    64	d	 
  0110 0101	      101    	65	e	 
  0110 0110	      102    	66	f	 
  0110 0111	      103    	67	g	 
  0110 1000	      104    	68	h	 
  0110 1001	      105	    69	i	 
  0110 1010	      106	    6A	j	 
  0110 1011	      107	    6B	k	 
  0110 1100	      108	    6C	l	 
  0110 1101	      109	    6D	m	 
  0110 1110	      110	    6E	n	 
  0110 1111	      111	    6F	o	 
  0111 0000	      112	    70	p	 
  0111 0001	      113	    71	q	 
  0111 0010	      114    	72	r	 
  0111 0011	      115    	73	s	 
  0111 0100	      116    	74	t	 
  0111 0101	      117    	75	u	 
  0111 0110	      118    	76	v	 
  0111 0111	      119    	77	w	 
  0111 1000	      120    	78	x	 
  0111 1001	      121	    79	y	 
  0111 1010	      122	    7A	z	 
  
  0111 1011	      123    	7B	{	 
  0111 1100	      124    	7C	|	 
  0111 1101	      125    	7D	}	 
  0111 1110	      126	    7E	~	 
----------------------------------------------------------------------------------

其他编码

UTF-8

UTF-8由4种编码方式实现,即UTF8-1 / UTF8-2 / UTF8-3 / UTF8-4。

  • UTF-8采用变长的表示方法。每个编码区有不同的字码长度,不同类型的字符可以由1-6个字节组成。
  • 如果是1字节,最高位(第8位)是0,则表示这个是1个ASCII字符(00-7F)
  • 如果是一个字节,以11开头,表示这个是一个双字节的字符,这个是它的首字节
  • 如果是一个字节,以10开头,表示这个是一个双字节的字符,这个是它的末字节,要向前查找,才能得到当前字符的首字节。

GB18030编码

全称是“信息技术 中文编码字符集”,是我国的强制标准,它可能是单字节,双字节或者四字节编码,它的编码与GB2312兼容,实际应用中不广泛

UTF-16编码

用两个字节来表示Unicode的转化格式,采用定长的表示方法,16bit,所以叫UTF-16,每两个字节表示一个字符,大大简化了字符串操作,所以这也是JAVA以UTF-16作为内存的字符存储格式的重要原因

ISO-8859-1编码

在ASCII码基础上扩展的编码,包括ISO-8859-1到ISO-8859-15,其中ISO-8859-1涵盖了大多数西欧字符,所以应用的最广泛。单字节编码,共256个字符

GB2312编码

全称“信息技术中文编码字符集”,双字节编码,编码范围A1-F7,其中A1-A9是符号区,总共包含682个符号;B0-B7是汉字区,包含6763个字汉

GBK编码

全称“汉字内码扩展规范”,为了扩展GB2312而出现,编码范围是8140-FEFE(去掉XX7F),总共有23940个码位,能表示31003个汉字;兼容GB2312,可以用GBK解码GB2312的汉字

Base64编码

Base64编码表

----------------------------------------------------------------------------------
  码值	字符	码值	字符	码值	字符	码值	字符	码值	字符	码值	字符	码值	字符	码值	字符
----------------------------------------------------------------------------------
  0	   A	   8	   I	  16		Q		  24	 Y	   32	   g	  40	  o	    48	 w	   56	  4
  1	   B	   9	   J	  17		R		  25	 Z	   33	   h	  41	  p	    49	 x	   57	  5
  2	   C	   10	   K	  18		S		  26   a	   34	   i	  42	  q	    50	 y	   58	  6
  3	   D	   11	   L	  19		T		  27   b	   35	   j   	43	  r	    51	 z	   59	  7
  4	   E	   12	   M	  20		U		  28 	 c	   36	   k	  44	  s	    52	 0	   60	  8
  5	   F	   13	   N		21		V		  29	 d	   37	   l	  45	  t	    53	 1	   61	  9
  6	   G	   14	   O		22		W		  30	 e	   38	   m	  46	  u	    54	 2	   62	  +
  7	   H	   15	   P		23		X		  31	 f	   39	   n	  47	  v	    55	 3	   63	  /
----------------------------------------------------------------------------------

具体实现

if (!Shotgun)
  var Shotgun = {};
if (!Shotgun.Js)
  Shotgun.Js = {};

Shotgun.Js.Base64 = {
  _table: [
    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
    'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
    'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
    'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
  ],

  encode: function (bin) {
    var codes = [];
    var un = 0;
    un = bin.length % 3;
    if (un == 1)
      bin.push(0, 0);
    else if (un == 2)
      bin.push(0);
    for (var i = 2; i < bin.length; i += 3) {
      var c = bin[i - 2] << 16;
      c |= bin[i - 1] << 8;
      c |= bin[i];
      codes.push(this._table[c >> 18 & 0x3f]);
      codes.push(this._table[c >> 12 & 0x3f]);
      codes.push(this._table[c >> 6 & 0x3f]);
      codes.push(this._table[c & 0x3f]);
    }
    if (un >= 1) {
        codes[codes.length - 1] = "=";
        bin.pop();
    }
    if (un == 1) {
        codes[codes.length - 2] = "=";
        bin.pop();
    }
    return codes.join("");
  },
  decode: function (base64Str) {
    var i = 0;
    var bin = [];
    var x = 0, code = 0, eq = 0;
    while (i < base64Str.length) {
      var c = base64Str.charAt(i++);
      var idx = this._table.indexOf(c);
      if (idx == -1) {
        switch (c) {
            case '=': idx = 0; eq++; break;
            case ' ':
            case '\n':
            case "\r":
            case '\t':
                continue;
            default:
                throw { "message": "\u0062\u0061\u0073\u0065\u0036\u0034\u002E\u0074\u0068\u0065\u002D\u0078\u002E\u0063\u006E\u0020\u0045\u0072\u0072\u006F\u0072\u003A\u65E0\u6548\u7F16\u7801\uFF1A" + c };
        }
      }
      if (eq > 0 && idx != 0)
          throw { "message": "\u0062\u0061\u0073\u0065\u0036\u0034\u002E\u0074\u0068\u0065\u002D\u0078\u002E\u0063\u006E\u0020\u0045\u0072\u0072\u006F\u0072\u003A\u7F16\u7801\u683C\u5F0F\u9519\u8BEF\uFF01" };

      code = code << 6 | idx;
      if (++x != 4)
          continue;
      bin.push(code >> 16);
      bin.push(code >> 8 & 0xff);
      bin.push(code & 0xff)
      code = x = 0;
    }
    if (code != 0)
        throw { "message": "\u0062\u0061\u0073\u0065\u0036\u0034\u002E\u0074\u0068\u0065\u002D\u0078\u002E\u0063\u006E\u0020\u0045\u0072\u0072\u006F\u0072\u003A\u7F16\u7801\u6570\u636E\u957F\u5EA6\u9519\u8BEF" };
    if (eq == 1)
        bin.pop();
    else if (eq == 2) {
        bin.pop();
        bin.pop();
    } else if (eq > 2)
        throw { "message": "\u0062\u0061\u0073\u0065\u0036\u0034\u002E\u0074\u0068\u0065\u002D\u0078\u002E\u0063\u006E\u0020\u0045\u0072\u0072\u006F\u0072\u003A\u7F16\u7801\u683C\u5F0F\u9519\u8BEF\uFF01" };

    return bin;
  }
};

Last Updated:
Contributors: 709992523