URL 编码的原理其实很朴素:把“不允许直接出现的字符”换成安全的形式,等接收方再还原。
编码规则
每个需要编码的字符,先取它在 UTF-8 编码下的字节值,再把字节值写成两位十六进制,前面加一个百分号。空格在 ASCII 表里的值是 32,十六进制是 20,所以空格编码为 %20;& 的值是 38,十六进制 26,编码为 %26。
中文为什么是一长串
中文字符在 UTF-8 下通常占 3 个字节,每个字节都要转成 %XX。比如“你”编码后是 %E4%BD%A0,三个字节三组百分号,看起来很长,但这正是它能在 URL 里安全传输的方式。
哪些字符不用编码
英文字母、数字和 - _ . ~ 属于“非保留字符”,可以直接使用;而 / ? & = # 等属于“保留字符”,只有在作为数据结构符号时才保留原样,作为数据内容时必须编码。
理解这套规则后,再看地址栏里的 %XX 就一点不神秘了,无非是“字节的十六进制写法”。