编码与解码
重要通知
。
基本概况
- 字符集和字符编码:https://www.runoob.com/w3cnote/charset-encoding.html
- 各种编码转换:https://tool.chinaz.com/tools/unicode.aspx
转义字符
-------------------------------------------------
转义字符 所代表的字符
-------------------------------------------------
\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/
汉字Unicode编码范围
----------------------------------------------------------------------------------
字符集 字数 Unicode 编码
----------------------------------------------------------------------------------
基本汉字 20902字 4E00-9FA5
基本汉字补充 90字 9FA6-9FFF
扩展A 6592字 3400-4DBF
扩展B 42720字 20000-2A6DF
扩展C 4153字 2A700-2B738
扩展D 222字 2B740-2B81D
扩展E 5762字 2B820-2CEA1
扩展F 7473字 2CEB0-2EBE0
扩展G 4939字 30000-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
汉语注音 43字 3105-312F
注音扩展 22字 31A0-31BA
〇 1字 3007
----------------------------------------------------------------------------------
中文汉字编码范围
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;
}
};