跳至主要內容

编码

大约 14 分钟

编码


ASCII 码表

ASCII - 维基百科,自由的百科全书 (wikipedia.org)open in new window

ASCII码对照表 (oschina.net)open in new window

ASCII的局限在于只能显示26个基本拉丁字母、阿拉伯数字和英式标点符号,因此只能用于显示现代美国英语(且处理naïve、café、élite等外来语open in new window时,必须去除附加符号open in new window) 。

虽然EASCII解决了部分西欧语言的显示问题,但对更多其他语言依然无能为力。因此,现在的软件系统大多采用Unicodeopen in new window,特别是与ASCII向下兼容的UTF-8open in new window


ASCII值控制字符ASCII值控制字符ASCII值控制字符ASCII值控制字符
0NUT32(space)64@96
1SOH33!65A97a
2STX34"66B98b
3ETX35#67C99c
4EOT36$68D100d
5ENQ37%69E101e
6ACK38&70F102f
7BEL39,71G103g
8BS40(72H104h
9HT41)73I105i
10LF42*74J106j
11VT43+75K107k
12FF44,76L108l
13CR45-77M109m
14SO46.78N110n
15SI47/79O111o
16DLE48080P112p
17DCI49181Q113q
18DC250282R114r
19DC351383S115s
20DC452484T116t
21NAK53585U117u
22SYN54686V118v
23TB55787W119w
24CAN56888X120x
25EM57989Y121y
26SUB58:90Z122z
27ESC59;91[123{
28FS60<92\124|
29GS61=93]125}
30RS62>94^126`
31US63?95_127DEL

特殊字符解释:

NUL空VT 垂直制表SYN 空转同步
STX 正文开始CR 回车CAN 作废
ETX 正文结束SO 移位输出EM 纸尽
EOY 传输结束SI 移位输入SUB 换置
ENQ 询问字符DLE 空格ESC 换码
ACK 承认DC1 设备控制1FS 文字分隔符
BEL 报警DC2 设备控制2GS 组分隔符
BS 退一格DC3 设备控制3RS 记录分隔符
HT 横向列表DC4 设备控制4US 单元分隔符
LF 换行NAK 否定DEL 删除

URL 编码(百分比编码)

HTML URL 编码参考手册 (w3school.com.cn)open in new window


  • URL - 统一资源定位器(Uniform Resource Locator)

  • Web 浏览器使用 URL 从 Web 服务器请求页面。

  • URL 是网页的地址,比如:https://www.w3school.com.cn

  • URL 编码将字符转换为可通过因特网传输的格式。

  • URL 只能使用 ASCII 字符集open in new window 通过因特网进行发送。

  • 由于 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)open in new window

Windows-1252 是 Microsoft Windows 中的第一个默认字符集。

从 1985 年到 1990 年,它是 Windows 中最流行的字符集。


HTML Unicode (UTF-8) 参考手册 (w3school.com.cn)open in new window

Unicode 联盟开发了 Unicode 标准。他们的目标是用其标准的 Unicode 转换格式(UTF) 替换现有的字符集。

Unicode 标准已经获得成功,并通过 HTML、XML、Java、JavaScript、电子邮件、ASP、PHP 等得以实现。在许多操作系统和所有现代浏览器中,同样支持 Unicode 标准。

Unicode 可以通过不同的字符集实现。最常用的编码是 UTF-8 和 UTF-16:

字符集说明
UTF-8UTF8 中的字符长度可以是 1 到 4 个字节。UTF-8 可以表示 Unicode 标准中的任何字符。UTF-8 向后兼容 ASCII。 UTF-8 是电子邮件和网页的首选编码
UTF-1616 位 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 转义字符

HTML转义字符对照表 (oschina.net)open in new window


字符十进制转义字符
"&#34;&quot;
&&#38;&amp;
<&#60;&lt;
>&#62;&gt;
不断开空格(non-breaking space)&#160;&nbsp;

HTML特殊转义字符对照表:

字符十进制转义字符字符十进制转义字符字符十进制转义字符
?&#161;&iexcl;Á&#193;&Aacute;á&#225;&aacute;
&#162;&cent;Â&#194;&circ;â&#226&acirc;
&#163;&pound;Ã&#195;&Atilde;ã&#227;&atilde;
¤&#164;&curren;Ä&#196;&Aumlä&#228;&auml;
&#165;&yen;Å&#197;&ring;å&#229;&aring;
|&#166;&brvbar;Æ&#198;&AElig;æ&#230;&aelig;
§&#167;&sect;Ç&#199;&Ccedil;ç&#231;&ccedil;
¨&#168;&uml;È&#200;&Egrave;è&#232;&egrave;
©&#169;&copy;É&#201;&Eacute;é&#233;&eacute;
a&#170;&ordf;Ê&#202;&Ecirc;ê&#234;&ecirc;
?&#171;&laquo;Ë&#203;&Euml;ë&#235;&euml;
?&#172;&not;Ì&#204;&Igrave;ì&#236;&igrave;
/x7f&#173;&shy;Í&#205;&Iacute;í&#237;&iacute;
®&#174;&reg;Î&#206;&Icirc;î&#238;&icirc;
ˉ&#175;&macr;Ï&#207;&Iuml;ï&#239;&iuml;
°&#176;&deg;Ð&#208;&ETH;ð&#240;&ieth;
±&#177;&plusmn;Ñ&#209;&Ntilde;ñ&#241;&ntilde;
2&#178;&sup2;Ò&#210;&Ograve;ò&#242;&ograve;
3&#179;&sup3;Ó&#211;&Oacute;ó&#243;&oacute;
&#180;&acute;Ô&#212;&Ocirc;ô&#244;&ocirc;
μ&#181;&micro;Õ&#213;&Otilde;õ&#245;&otilde;
?&#182;&para;Ö&#214;&Ouml;ö&#246;&ouml;
·&#183;&middot;&times;&#215;&times;÷&#247;&divide;
?&#184;&cedil;Ø&#216;&Oslash;ø&#248;&oslash;
1&#185;&sup1;Ù&#217;&Ugrave;ù&#249;&ugrave;
o&#186;&ordm;Ú&#218;&Uacute;ú&#250;&uacute;
?&#187;&raquo;Û&#219;&Ucirc;û&#251;&ucirc;
?&#188;&frac14;Ü&#220;&Uuml;ü&#252;&uuml;
?&#189;&frac12;Ý&#221;&Yacute;ý&#253;&yacute;
?&#190;&frac34;Þ&#222;&THORN;þ&#254;&thorn;
?&#191;&iquest;ß&#223;&szlig;ÿ&#255;&yuml;
À&#192;&Agrave;à&#224;&agrave;

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 - 维基百科,自由的百科全书 (wikipedia.org)open in new window

UTF-8 是一种可变长度字符编码方式, 也是一种前缀码open in new window, 它使用 1~4 个字节对 Unicode 字符集中的所有有效编码点进行编码, 属于 Unicode 标准的一部分

UTF-8 的诞生是由于 Unicode 中较小值的编码点一般使用频率比较高, 直接用 Unicode编码效率低下, 浪费内存空间;

UTF-8 对于 Unicode 中前 128 个字符, 使用与 ASCII 码相同的二进制的单个字节进行编码, 而且字面与 ASCII码 的字面一一对应, 这使得原来处理ASCII字符的软件open in new window无须或只须做少部分修改,即可继续使用。自2009年以来,UTF-8一直是万维网open in new window的最主要的编码形式

UTF-8使用一至六个字节open in new window为每个字符编码(尽管如此,2003年11月UTF-8被RFC 3629重新规范,只能使用原来Unicode定义的区域,U+0000到U+10FFFF,也就是说最多四个字节) :

  1. 128个US-ASCII字符只需一个字节编码(Unicode范围由U+0000至U+007F) 。
  2. 带有附加符号open in new window拉丁文open in new window希腊文open in new window西里尔字母open in new window亚美尼亚语open in new window希伯来文open in new window阿拉伯文open in new window叙利亚文open in new window它拿字母open in new window则需要两个字节编码(Unicode范围由U+0080至U+07FF) 。
  3. 其他基本多文种平面open in new window(BMP) 中的字符(这包含了大部分常用字,如大部分的汉字) 使用三个字节编码(Unicode范围由U+0800至U+FFFF) 。
  4. 其他极少使用的Unicode 辅助平面open in new window的字符使用四至六字节编码(Unicode范围由U+10000至U+1FFFFF使用四字节,Unicode范围由U+200000至U+3FFFFFF使用五字节,Unicode范围由U+4000000至U+7FFFFFFF使用六字节) 。

对上述提及的第四种字符而言,UTF-8使用四至六个字节来编码似乎太耗费资源了。但UTF-8对所有常用的字符都可以用三个字节表示,而且它的另一种选择,UTF-16编码open in new window,对前述的第四种字符同样需要四个字节来编码,所以要决定UTF-8或UTF-16哪种编码比较有效率,还要视所使用的字符的分布范围而定。不过,如果使用一些传统的压缩系统,比如DEFLATEopen in new window,则这些不同编码系统间的的差异就变得微不足道了。若顾及传统压缩算法在压缩较短文字上的效果不大,可以考虑使用Unicode标准压缩格式open in new window(SCSU) 。


UTF-16

UTF-16 - 维基百科,自由的百科全书 (wikipedia.org)open in new window

Unicode中UTF-8与UTF-16编码详解-腾讯云开发者社区-腾讯云 (tencent.com)open in new window

UTF-16 编码把 Unicode字符集的抽象码位open in new window映射为16位长的整数(即码元open in new window) 的序列,用于数据存储或传递。Unicode字符的码位,需要1个或者2个16位长的码元来表示,因此这是一个变长表示。

  • 码位(Code Point) : 码位是Unicode字符集中的抽象编号,用来标识每个字符。每个字符都有一个唯一的码位。
  • 码元(Code Unit) : 码元是编码后的结果,它是计算机存储和传输字符时使用的实际值。在UTF-16中,一个码元由16位组成。
  • 变长表示: 在UTF-16中,大部分的常见Unicode字符(基本多文种平面中的字符) 可以使用单个16位码元表示,但某些字符的码位超出了16位的范围,因此需要使用两个连续的16位码元(称为代理对) 来表示。这导致UTF-16是一种变长编码,因为不同的字符可能占用不同数量的码元。

UTF-16的大尾序和小尾序存储形式都在用。一般来说,以Macintoshopen in new window制作或存储的文字使用大尾序格式,以Microsoftopen in new windowLinuxopen in new window制作或存储的文字使用小尾序格式。

为了弄清楚UTF-16文件的大小尾序,在UTF-16文件的开首,都会放置一个U+FEFF字符作为Byte Order Markopen in new window(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 型变量对应一个宽字符open in new window、可以存储一个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'

image-20230831164926592

  • 火绒会直接对 powershell -enc 参数报可疑

    image-20230831165029325

    image-20230831165018229

  • Windwos Defender 则不会直接拦截 powershell -enc, 但是执行 Powershell empire http listener 上线命令时会阻断