编码
编码
ASCII 码表
ASCII的局限在于只能显示26个基本拉丁字母、阿拉伯数字和英式标点符号,因此只能用于显示现代美国英语(且处理naïve、café、élite等外来语时,必须去除附加符号) 。
虽然EASCII解决了部分西欧语言的显示问题,但对更多其他语言依然无能为力。因此,现在的软件系统大多采用Unicode,特别是与ASCII向下兼容的UTF-8。
ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 |
---|---|---|---|---|---|---|---|
0 | NUT | 32 | (space) | 64 | @ | 96 | 、 |
1 | SOH | 33 | ! | 65 | A | 97 | a |
2 | STX | 34 | " | 66 | B | 98 | b |
3 | ETX | 35 | # | 67 | C | 99 | c |
4 | EOT | 36 | $ | 68 | D | 100 | d |
5 | ENQ | 37 | % | 69 | E | 101 | e |
6 | ACK | 38 | & | 70 | F | 102 | f |
7 | BEL | 39 | , | 71 | G | 103 | g |
8 | BS | 40 | ( | 72 | H | 104 | h |
9 | HT | 41 | ) | 73 | I | 105 | i |
10 | LF | 42 | * | 74 | J | 106 | j |
11 | VT | 43 | + | 75 | K | 107 | k |
12 | FF | 44 | , | 76 | L | 108 | l |
13 | CR | 45 | - | 77 | M | 109 | m |
14 | SO | 46 | . | 78 | N | 110 | n |
15 | SI | 47 | / | 79 | O | 111 | o |
16 | DLE | 48 | 0 | 80 | P | 112 | p |
17 | DCI | 49 | 1 | 81 | Q | 113 | q |
18 | DC2 | 50 | 2 | 82 | R | 114 | r |
19 | DC3 | 51 | 3 | 83 | S | 115 | s |
20 | DC4 | 52 | 4 | 84 | T | 116 | t |
21 | NAK | 53 | 5 | 85 | U | 117 | u |
22 | SYN | 54 | 6 | 86 | V | 118 | v |
23 | TB | 55 | 7 | 87 | W | 119 | w |
24 | CAN | 56 | 8 | 88 | X | 120 | x |
25 | EM | 57 | 9 | 89 | Y | 121 | y |
26 | SUB | 58 | : | 90 | Z | 122 | z |
27 | ESC | 59 | ; | 91 | [ | 123 | { |
28 | FS | 60 | < | 92 | \ | 124 | | |
29 | GS | 61 | = | 93 | ] | 125 | } |
30 | RS | 62 | > | 94 | ^ | 126 | ` |
31 | US | 63 | ? | 95 | _ | 127 | DEL |
特殊字符解释
:
NUL空 | VT 垂直制表 | SYN 空转同步 |
---|---|---|
STX 正文开始 | CR 回车 | CAN 作废 |
ETX 正文结束 | SO 移位输出 | EM 纸尽 |
EOY 传输结束 | SI 移位输入 | SUB 换置 |
ENQ 询问字符 | DLE 空格 | ESC 换码 |
ACK 承认 | DC1 设备控制1 | FS 文字分隔符 |
BEL 报警 | DC2 设备控制2 | GS 组分隔符 |
BS 退一格 | DC3 设备控制3 | RS 记录分隔符 |
HT 横向列表 | DC4 设备控制4 | US 单元分隔符 |
LF 换行 | NAK 否定 | DEL 删除 |
URL 编码(百分比编码)
HTML URL 编码参考手册 (w3school.com.cn)
URL
- 统一资源定位器(Uniform Resource Locator)Web 浏览器使用 URL 从 Web 服务器请求页面。
URL 是网页的地址,比如:
https://www.w3school.com.cn
。URL 编码将字符转换为可通过因特网传输的格式。
URL 只能使用 ASCII 字符集 通过因特网进行发送。
由于 URL 通常包含 ASCII 集之外的字符,因此必须将 URL 转换为有效的 ASCII 格式。
URL 编码使用后跟十六进制数字的 "%" 替代不安全的 ASCII 字符。
URL 不能包含空格。URL 编码通常使用加号(+) 或 %20 替代空格。
在 JavaScript、PHP 和 ASP 中,有一些函数可用于对字符串进行 URL 编码。
- PHP 有
rawurlencode()
函数, - ASP 有
Server.URLEncode()
函数。 - JavaScript 有
encodeURIComponent()
函数。
浏览器将根据页面中使用的字符集对输入进行编码。
HTML5 中的默认字符集为 UTF-8。
HTML ASCII 参考手册 (w3school.com.cn)
Windows-1252
是 Microsoft Windows 中的第一个默认字符集。从 1985 年到 1990 年,它是 Windows 中最流行的字符集。
HTML Unicode (UTF-8) 参考手册 (w3school.com.cn)
Unicode 联盟开发了 Unicode 标准。他们的目标是用其标准的 Unicode 转换格式(UTF) 替换现有的字符集。
Unicode 标准已经获得成功,并通过 HTML、XML、Java、JavaScript、电子邮件、ASP、PHP 等得以实现。在许多操作系统和所有现代浏览器中,同样支持 Unicode 标准。
Unicode 可以通过不同的字符集实现。最常用的编码是 UTF-8 和 UTF-16:
字符集 说明 UTF-8 UTF8 中的字符长度可以是 1 到 4 个字节。UTF-8 可以表示 Unicode 标准中的任何字符。UTF-8 向后兼容 ASCII。 UTF-8 是电子邮件和网页的首选编码 UTF-16 16 位 Unicode 转换格式是 Unicode 的可变长度字符编码,能够对整个 Unicode repertoire 进行编码。UTF-16 用于主要的操作系统和环境,例如 Microsoft Windows、Java 和 .NET。 Unicode 的前 128 个字符(与 ASCII 一一对应) 使用单个八位字节编码,这八位字节有与 ASCII 相同的二进制值,从而使有效的 ASCII 文本也成为有效的 UTF-8 编码 Unicode。
HTML 4 支持 UTF-8。 HTML 5 支持 UTF-8 和 UTF-16!
URL 编码参考手册
字符 | 来自 Windows-1252 | 来自 UTF-8 |
---|---|---|
space | %20 | %20 |
! | %21 | %21 |
" | %22 | %22 |
# | %23 | %23 |
$ | %24 | %24 |
% | %25 | %25 |
& | %26 | %26 |
' | %27 | %27 |
( | %28 | %28 |
) | %29 | %29 |
* | %2A | %2A |
+ | %2B | %2B |
, | %2C | %2C |
- | %2D | %2D |
. | %2E | %2E |
/ | %2F | %2F |
0 | %30 | %30 |
1 | %31 | %31 |
2 | %32 | %32 |
3 | %33 | %33 |
4 | %34 | %34 |
5 | %35 | %35 |
6 | %36 | %36 |
7 | %37 | %37 |
8 | %38 | %38 |
9 | %39 | %39 |
: | %3A | %3A |
; | %3B | %3B |
< | %3C | %3C |
= | %3D | %3D |
> | %3E | %3E |
? | %3F | %3F |
@ | %40 | %40 |
A | %41 | %41 |
B | %42 | %42 |
C | %43 | %43 |
D | %44 | %44 |
E | %45 | %45 |
F | %46 | %46 |
G | %47 | %47 |
H | %48 | %48 |
I | %49 | %49 |
J | %4A | %4A |
K | %4B | %4B |
L | %4C | %4C |
M | %4D | %4D |
N | %4E | %4E |
O | %4F | %4F |
P | %50 | %50 |
Q | %51 | %51 |
R | %52 | %52 |
S | %53 | %53 |
T | %54 | %54 |
U | %55 | %55 |
V | %56 | %56 |
W | %57 | %57 |
X | %58 | %58 |
Y | %59 | %59 |
Z | %5A | %5A |
[ | %5B | %5B |
\ | %5C | %5C |
] | %5D | %5D |
^ | %5E | %5E |
_ | %5F | %5F |
` | %60 | %60 |
a | %61 | %61 |
b | %62 | %62 |
c | %63 | %63 |
d | %64 | %64 |
e | %65 | %65 |
f | %66 | %66 |
g | %67 | %67 |
h | %68 | %68 |
i | %69 | %69 |
j | %6A | %6A |
k | %6B | %6B |
l | %6C | %6C |
m | %6D | %6D |
n | %6E | %6E |
o | %6F | %6F |
p | %70 | %70 |
q | %71 | %71 |
r | %72 | %72 |
s | %73 | %73 |
t | %74 | %74 |
u | %75 | %75 |
v | %76 | %76 |
w | %77 | %77 |
x | %78 | %78 |
y | %79 | %79 |
z | %7A | %7A |
{ | %7B | %7B |
| | %7C | %7C |
} | %7D | %7D |
~ | %7E | %7E |
%7F | %7F | |
` | %80 | %E2%82%AC |
| %81 | %81 |
‚ | %82 | %E2%80%9A |
ƒ | %83 | %C6%92 |
„ | %84 | %E2%80%9E |
… | %85 | %E2%80%A6 |
† | %86 | %E2%80%A0 |
‡ | %87 | %E2%80%A1 |
ˆ | %88 | %CB%86 |
‰ | %89 | %E2%80%B0 |
Š | %8A | %C5%A0 |
‹ | %8B | %E2%80%B9 |
Œ | %8C | %C5%92 |
| %8D | %C5%8D |
Ž | %8E | %C5%BD |
| %8F | %8F |
| %90 | %C2%90 |
‘ | %91 | %E2%80%98 |
’ | %92 | %E2%80%99 |
“ | %93 | %E2%80%9C |
” | %94 | %E2%80%9D |
• | %95 | %E2%80%A2 |
– | %96 | %E2%80%93 |
— | %97 | %E2%80%94 |
˜ | %98 | %CB%9C |
™ | %99 | %E2%84 |
š | %9A | %C5%A1 |
› | %9B | %E2%80 |
œ | %9C | %C5%93 |
| %9D | %9D |
ž | %9E | %C5%BE |
Ÿ | %9F | %C5%B8 |
%A0 | %C2%A0 | |
¡ | %A1 | %C2%A1 |
¢ | %A2 | %C2%A2 |
£ | %A3 | %C2%A3 |
¤ | %A4 | %C2%A4 |
¥ | %A5 | %C2%A5 |
¦ | %A6 | %C2%A6 |
§ | %A7 | %C2%A7 |
¨ | %A8 | %C2%A8 |
© | %A9 | %C2%A9 |
ª | %AA | %C2%AA |
« | %AB | %C2%AB |
¬ | %AC | %C2%AC |
| %AD | %C2%AD |
® | %AE | %C2%AE |
¯ | %AF | %C2%AF |
° | %B0 | %C2%B0 |
± | %B1 | %C2%B1 |
² | %B2 | %C2%B2 |
³ | %B3 | %C2%B3 |
´ | %B4 | %C2%B4 |
µ | %B5 | %C2%B5 |
¶ | %B6 | %C2%B6 |
· | %B7 | %C2%B7 |
¸ | %B8 | %C2%B8 |
¹ | %B9 | %C2%B9 |
º | %BA | %C2%BA |
» | %BB | %C2%BB |
¼ | %BC | %C2%BC |
½ | %BD | %C2%BD |
¾ | %BE | %C2%BE |
¿ | %BF | %C2%BF |
À | %C0 | %C3%80 |
Á | %C1 | %C3%81 |
 | %C2 | %C3%82 |
à | %C3 | %C3%83 |
Ä | %C4 | %C3%84 |
Å | %C5 | %C3%85 |
Æ | %C6 | %C3%86 |
Ç | %C7 | %C3%87 |
È | %C8 | %C3%88 |
É | %C9 | %C3%89 |
Ê | %CA | %C3%8A |
Ë | %CB | %C3%8B |
Ì | %CC | %C3%8C |
Í | %CD | %C3%8D |
Î | %CE | %C3%8E |
Ï | %CF | %C3%8F |
Ð | %D0 | %C3%90 |
Ñ | %D1 | %C3%91 |
Ò | %D2 | %C3%92 |
Ó | %D3 | %C3%93 |
Ô | %D4 | %C3%94 |
Õ | %D5 | %C3%95 |
Ö | %D6 | %C3%96 |
× | %D7 | %C3%97 |
Ø | %D8 | %C3%98 |
Ù | %D9 | %C3%99 |
Ú | %DA | %C3%9A |
Û | %DB | %C3%9B |
Ü | %DC | %C3%9C |
Ý | %DD | %C3%9D |
Þ | %DE | %C3%9E |
ß | %DF | %C3%9F |
à | %E0 | %C3%A0 |
á | %E1 | %C3%A1 |
â | %E2 | %C3%A2 |
ã | %E3 | %C3%A3 |
ä | %E4 | %C3%A4 |
å | %E5 | %C3%A5 |
æ | %E6 | %C3%A6 |
ç | %E7 | %C3%A7 |
è | %E8 | %C3%A8 |
é | %E9 | %C3%A9 |
ê | %EA | %C3%AA |
ë | %EB | %C3%AB |
ì | %EC | %C3%AC |
í | %ED | %C3%AD |
î | %EE | %C3%AE |
ï | %EF | %C3%AF |
ð | %F0 | %C3%B0 |
ñ | %F1 | %C3%B1 |
ò | %F2 | %C3%B2 |
ó | %F3 | %C3%B3 |
ô | %F4 | %C3%B4 |
õ | %F5 | %C3%B5 |
ö | %F6 | %C3%B6 |
÷ | %F7 | %C3%B7 |
ø | %F8 | %C3%B8 |
ù | %F9 | %C3%B9 |
ú | %FA | %C3%BA |
û | %FB | %C3%BB |
ü | %FC | %C3%BC |
ý | %FD | %C3%BD |
þ | %FE | %C3%BE |
ÿ | %FF | %C3%BF |
Base64 编码
base64 编码速查表
HTML 实体编码
HTML 转义字符
字符 | 十进制 | 转义字符 |
---|---|---|
" | " | " |
& | & | & |
< | < | < |
> | > | > |
不断开空格(non-breaking space) |   | |
HTML特殊转义字符对照表
:
字符 | 十进制 | 转义字符 | 字符 | 十进制 | 转义字符 | 字符 | 十进制 | 转义字符 |
---|---|---|---|---|---|---|---|---|
? | ¡ | ¡ | Á | Á | Á | á | á | á |
¢ | ¢ | ¢ | Â | Â | ˆ | â | â | â |
£ | £ | £ | Ã | Ã | Ã | ã | ã | ã |
¤ | ¤ | ¤ | Ä | Ä | Ä | ä | ä | ä |
¥ | ¥ | ¥ | Å | Å | ˚ | å | å | å |
| | ¦ | ¦ | Æ | Æ | Æ | æ | æ | æ |
§ | § | § | Ç | Ç | Ç | ç | ç | ç |
¨ | ¨ | ¨ | È | È | È | è | è | è |
© | © | © | É | É | É | é | é | é |
a | ª | ª | Ê | Ê | Ê | ê | ê | ê |
? | « | « | Ë | Ë | Ë | ë | ë | ë |
? | ¬ | ¬ | Ì | Ì | Ì | ì | ì | ì |
/x7f | ­ | ­ | Í | Í | Í | í | í | í |
® | ® | ® | Î | Î | Î | î | î | î |
ˉ | ¯ | ¯ | Ï | Ï | Ï | ï | ï | ï |
° | ° | ° | Ð | Ð | Ð | ð | ð | &ieth; |
± | ± | ± | Ñ | Ñ | Ñ | ñ | ñ | ñ |
2 | ² | ² | Ò | Ò | Ò | ò | ò | ò |
3 | ³ | ³ | Ó | Ó | Ó | ó | ó | ó |
′ | ´ | ´ | Ô | Ô | Ô | ô | ô | ô |
μ | µ | µ | Õ | Õ | Õ | õ | õ | õ |
? | ¶ | ¶ | Ö | Ö | Ö | ö | ö | ö |
· | · | · | × | × | × | ÷ | ÷ | ÷ |
? | ¸ | ¸ | Ø | Ø | Ø | ø | ø | ø |
1 | ¹ | ¹ | Ù | Ù | Ù | ù | ù | ù |
o | º | º | Ú | Ú | Ú | ú | ú | ú |
? | » | » | Û | Û | Û | û | û | û |
? | ¼ | ¼ | Ü | Ü | Ü | ü | ü | ü |
? | ½ | ½ | Ý | Ý | Ý | ý | ý | ý |
? | ¾ | ¾ | Þ | Þ | Þ | þ | þ | þ |
? | ¿ | ¿ | ß | ß | ß | ÿ | ÿ | ÿ |
À | À | À | à | à | à |
Unicode 编码
Unicode 是为了解决传统的字符编码方案的局限而产生的, 他为每个语言的每个字符都设定了统一且唯一的二进制编码
通常Unicode编码是通过2 Byte来表示一个字符的,如U+A12B
,2 Byte的二进制表示方法结果就是1010(A)0001(1) 0010(2)1011(B)
。
UTF(Unicode Transfer Format)
UTF-8 以及 UTF-16 都是将 Unicode码转换成程序数据的编码方式
PS: Unicode 为字符编码的标准, 而 UTF-8 UTF-16 等等均为其具体的编码实现方式
UTF-8
UTF-8 是一种可变长度字符编码方式, 也是一种前缀码, 它使用 1~4 个字节对 Unicode 字符集中的所有有效编码点进行编码, 属于 Unicode 标准的一部分
UTF-8 的诞生是由于 Unicode 中较小值的编码点一般使用频率比较高, 直接用 Unicode编码效率低下, 浪费内存空间;
UTF-8 对于 Unicode 中前 128 个字符, 使用与 ASCII 码相同的二进制的单个字节进行编码, 而且字面与 ASCII码 的字面一一对应, 这使得原来处理ASCII字符的软件无须或只须做少部分修改,即可继续使用。自2009年以来,UTF-8一直是万维网的最主要的编码形式
UTF-8使用一至六个字节为每个字符编码(尽管如此,2003年11月UTF-8被RFC 3629重新规范,只能使用原来Unicode定义的区域,U+0000到U+10FFFF,也就是说最多四个字节) :
- 128个US-ASCII字符只需一个字节编码(Unicode范围由U+0000至U+007F) 。
- 带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及它拿字母则需要两个字节编码(Unicode范围由U+0080至U+07FF) 。
- 其他基本多文种平面(BMP) 中的字符(这包含了大部分常用字,如大部分的汉字) 使用三个字节编码(Unicode范围由U+0800至U+FFFF) 。
- 其他极少使用的Unicode 辅助平面的字符使用四至六字节编码(Unicode范围由U+10000至U+1FFFFF使用四字节,Unicode范围由U+200000至U+3FFFFFF使用五字节,Unicode范围由U+4000000至U+7FFFFFFF使用六字节) 。
对上述提及的第四种字符而言,UTF-8使用四至六个字节来编码似乎太耗费资源了。但UTF-8对所有常用的字符都可以用三个字节表示,而且它的另一种选择,UTF-16编码,对前述的第四种字符同样需要四个字节来编码,所以要决定UTF-8或UTF-16哪种编码比较有效率,还要视所使用的字符的分布范围而定。不过,如果使用一些传统的压缩系统,比如DEFLATE,则这些不同编码系统间的的差异就变得微不足道了。若顾及传统压缩算法在压缩较短文字上的效果不大,可以考虑使用Unicode标准压缩格式(SCSU) 。
UTF-16
UTF-16 编码把 Unicode字符集的抽象码位映射为16位长的整数(即码元) 的序列,用于数据存储或传递。Unicode字符的码位,需要1个或者2个16位长的码元来表示,因此这是一个变长表示。
- 码位(Code Point) : 码位是Unicode字符集中的抽象编号,用来标识每个字符。每个字符都有一个唯一的码位。
- 码元(Code Unit) : 码元是编码后的结果,它是计算机存储和传输字符时使用的实际值。在UTF-16中,一个码元由16位组成。
- 变长表示: 在UTF-16中,大部分的常见Unicode字符(基本多文种平面中的字符) 可以使用单个16位码元表示,但某些字符的码位超出了16位的范围,因此需要使用两个连续的16位码元(称为代理对) 来表示。这导致UTF-16是一种变长编码,因为不同的字符可能占用不同数量的码元。
UTF-16的大尾序和小尾序存储形式都在用。一般来说,以Macintosh制作或存储的文字使用大尾序格式,以Microsoft或Linux制作或存储的文字使用小尾序格式。
为了弄清楚UTF-16文件的大小尾序,在UTF-16文件的开首,都会放置一个U+FEFF字符作为Byte Order Mark(UTF-16 LE以 FF FE
代表,UTF-16 BE以 FE FF
代表) ,以显示这个文本文件是以UTF-16编码,其中U+FEFF字符在UNICODE中代表的意义是 ZERO WIDTH NO-BREAK SPACE
,顾名思义,它是个没有宽度也没有断字的空白。
Microsoft Windows操作系统内核对Unicode的支持
Windows操作系统内核中的字符表示为UTF-16小尾序,可以正确处理、显示以4字节存储的字符。但是Windows API实际上仅能正确处理UCS-2字符,即仅以2字节存储的,码位小于U+FFFF的Unicode字符。其根源是Microsoft C++语言把 wchar_t
数据类型定义为16比特的unsigned short,这就与一个 wchar_t
型变量对应一个宽字符、可以存储一个Unicode字符的规定相矛盾。相反,Linux平台的GCC编译器规定一个 wchar_t
是4字节长度,可以存储一个UTF-32字符,宁可浪费了很大的存储空间。
UTF-16 在 powershell 中的应用
powershell -enc
命令可以接收 Base64 编码的 UTF-16 LE 命令, powershell empire
的默认 http listener for powershell 的上线命令就使用了这个参数
例如 whoami
, 使用如下脚本生成编码后的命令:
import base64
def gen_enc_cmd(plain_cmd: str) -> str:
"""将 cmd 先 Unicode 编码然后 base64 编码"""
utf_16_le_cmd = plain_cmd.encode("utf-16-le")
utf_8_cmd = plain_cmd.encode("utf-8")
utf_16_be_cmd = plain_cmd.encode("utf-16-be")
base64_cmd = base64.b64encode(utf_8_cmd)
base64_utf_16_le_cmd = base64.b64encode(utf_16_le_cmd)
base64_utf_16_be_cmd = base64.b64encode(utf_16_be_cmd)
print(f"UTF-8 编码: {utf_8_cmd}")
print(f"UTF-16 LE 编码: {utf_16_le_cmd}")
print(f"UTF-16 BE 编码: {utf_16_be_cmd}")
print(f"Base64 编码: {base64_cmd}")
print(f"Base64 UTF-16 LE 编码: {base64_utf_16_le_cmd}")
print(f"Base64 UTF-16 BE 编码: {base64_utf_16_be_cmd}")
gen_enc_cmd("whoami")
输出结果
UTF-8 编码: b'whoami'
UTF-16 LE 编码: b'w\x00h\x00o\x00a\x00m\x00i\x00'
UTF-16 BE 编码: b'\x00w\x00h\x00o\x00a\x00m\x00i'
Base64 编码: b'd2hvYW1p'
Base64 UTF-16 LE 编码: b'dwBoAG8AYQBtAGkA'
Base64 UTF-16 BE 编码: b'AHcAaABvAGEAbQBp'
火绒会直接对
powershell -enc
参数报可疑Windwos Defender 则不会直接拦截
powershell -enc
, 但是执行Powershell empire http listener
上线命令时会阻断