这张表把常用字符在三种编码下的值并排列出来,四列分别是:字符本身、URL 编码(百分号编码)、HTML 实体、Base64。做网页、写接口、排查乱码,或者只是想知道某个符号编码后长什么样,都可以直接来这张表里查。第一列里的空格和中文,是为了让你看到多字节字符的编码结果,实际使用时按字符查对应那一行即可。
URL 编码:中文和符号为什么都要转义
网址只允许一部分字符原样出现,中文、空格,以及 & ? = # 这些有特殊含义的符号,都要写成 %XX 的形式。规则是按字节来:一个 UTF-8 汉字占 3 个字节,就编成 3 组 %XX,「中」写成 %E4%B8%AD 就是这个道理。表里从空格到中文一列,正好能看清 ASCII 字符是 1 组 %XX、汉字是 3 组的差别。
空格到底是 %20 还是加号
这是最容易混淆的一处。表里空格对应的是 %20,它在网址路径里通用;而在表单提交(application/x-www-form-urlencoded)的语境里,空格会写成加号。所以看到加号时先判断场合:普通网址里它是字面加号,表单数据里它才代表空格。拿不准就用 %20,兼容性最好。
HTML 实体:& 和 < 为什么必须转义
HTML 里有两个符号是保留的:& 是实体的引导符,< 是标签的开始,直接写在正文里会被浏览器误解,所以必须转义成 & 和 <。表里能看到,多数符号其实无需转义,真正必须处理的就那么几个:&、<、>,以及写在属性里的引号。实体有两种写法,像 & 这样有名字的叫命名实体,' 这样用数字的叫数字实体,效果一样。
Base64:把二进制搬进文本,但它不是加密
Base64 列给出的是单个字符编码后的结果,一个 ASCII 字符会变成 2 个字符再加两个等号填充。它常被用来把图片、文件塞进 JSON 或网页里。要提醒的是,Base64 不是加密,任何人都能解码还原;它的价值在于把不能直接放进文本的数据变成可打印字符,而不是保密。
同一个字符,三列的值怎么对起来
拿 & 举例:URL 编码是 %26,HTML 实体是 &,Base64 是 Jg==。三者长度和形态都不一样,是因为它们服务于不同环节——URL 编码让字符能安全出现在网址里,HTML 实体让字符能安全出现在网页里,Base64 则把字节换成可打印字符。查表时先想清楚你要放进哪里,再去对应那一列取值,就不会取错。
中文为什么在每一列都变长
中文在 URL 编码和 Base64 里都比英文长,原因相同:它们在 UTF-8 里占 3 个字节,而 ASCII 字符只占 1 个字节。所以「中」的 URL 编码是 3 组 %XX,Base64 是 4 个字符;一个英文字母则只占 1 组 %XX、Base64 也只有 2 个字符加填充。HTML 实体这一列,中文通常写成数字实体(如 中),位数也比字母多。理解了字节数,长度的差异就都能解释。
查表之外:这些场景最容易用错
三种编码各有各的边界。URL 编码别拿加号去拼普通网址,也别把整条网址用 encodeURIComponent 全编一遍,那会把结构符号也破坏掉。HTML 实体只用在网页里,别把它写进 JSON 或数据库字段。Base64 只负责搬运,不要指望它保密。记住这三条,能避开大部分因为编码用错导致的乱码和报错。
常用字符的 URL / HTML / Base64 编码对照
| 字符 | URL 编码 | HTML 实体 | Base64 |
|---|---|---|---|
| (空格) | %20 |   | IA== |
| ! | %21 | 无需转义 | IQ== |
| " | %22 | " | Ig== |
| # | %23 | 无需转义 | Iw== |
| $ | %24 | 无需转义 | JA== |
| % | %25 | 无需转义 | JQ== |
| & | %26 | & | Jg== |
| ' | %27 | ' | Jw== |
| ( | %28 | 无需转义 | KA== |
| ) | %29 | 无需转义 | KQ== |
| * | %2A | 无需转义 | Kg== |
| + | %2B | 无需转义 | Kw== |
| , | %2C | 无需转义 | LA== |
| - | %2D | 无需转义 | LQ== |
| . | %2E | 无需转义 | Lg== |
| / | %2F | 无需转义 | Lw== |
| : | %3A | 无需转义 | Og== |
| ; | %3B | 无需转义 | Ow== |
| = | %3D | 无需转义 | PQ== |
| ? | %3F | 无需转义 | Pw== |
| @ | %40 | 无需转义 | QA== |
| [ | %5B | 无需转义 | Ww== |
| ] | %5D | 无需转义 | XQ== |
| < | %3C | < | PA== |
| > | %3E | > | Pg== |
| 0 | %30 | 无需转义 | MA== |
| 1 | %31 | 无需转义 | MQ== |
| 9 | %39 | 无需转义 | OQ== |
| A | %41 | 无需转义 | QQ== |
| Z | %5A | 无需转义 | Wg== |
| a | %61 | 无需转义 | YQ== |
| z | %7A | 无需转义 | eg== |
| 中 | %E4%B8%AD | 中 | 5Lit |
| 文 | %E6%96%87 | 文 | 5paH |
| 你 | %E4%BD%A0 | 你 | 5L2g |
| 好 | %E5%A5%BD | 好 | 5aW9 |
延伸阅读:Base64 编码解码 · URL 编码解码
参考资料
常见问题
URL 编码、HTML 实体、Base64 该用哪个?
看数据要放进哪里:放进网址用 URL 编码,放进网页正文或属性用 HTML 实体,要嵌进 JSON、代码或文本里搬运二进制用 Base64。三者不是互相替代的关系。
空格在表里是 %20,为什么有时又看到加号?
%20 是网址里的通用写法;加号表示空格只出现在表单提交(application/x-www-form-urlencoded)的语境里。在网址路径、查询参数里统一用 %20,兼容性最好。