URL 中的空格、加号和%20 - DongSuo's Blog

URL 中的空格、加号和%20

今天跟同事一起遇到了一个问题:URL 中的空格有的时候被 encode 成 + 号,有的时候被 encode 成 %20,但是在 Golang 中,只能被 encode 成 + 号,而前端 Javascript 中,却只能成功 decode %20 的格式。
为什么空格会被 encode 成两种不同的符号呢?
原来在 1995 年发布的 HTML2.0 标准里,form 提交应该被 encode 成 `application/x-www-form-urlencoded`格式,其中 query 的空格应该被 encode 成加号,原文如下:
The form field names and values are escaped: space characters are replaced by `+', and then reserved characters are escaped as per [URL];
但是在 URI URL 的标准中,又只提到特殊字符应该用百分号加上十六进制 ASCII 码的形式表示,比如空格应该用 %20 来表示。
根据具体性原则来说,HTML2.0 的标准对空格有更具体的表述,似乎应该以加号为准,但是也正因为 HTML2.0 的表述更具体,因此它其实概括不了更广泛的场景,因而其他场景下就不那么适用了,比如在服务端、在 Javascript 环境中等等。
考虑到 HTML2.0 已经是一份 25 年前的标准了,且其适用场景非常局限,而且这份标准本身也已经被新的标准所废弃,因此我们在工作中应该尽量用 %20 的去 encode 空格。Golang 社区中也曾经对这个问题进行过讨论,但是貌似没有下文。
 
 
-- The End --