编码
编码
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上线命令时会阻断
