http_build_query是PHP中的一个函数,常用于生成URL-encode字符串或签名字符串。
通常的操作如下:
使用http_build_query拼接字符串,可能会存在编码问题,尤其是其中包含特殊字符的时候。这是因为在不同的编码下http_build_query对特殊字符的编码规则不一样。
http_build_query有两种编码,RFC1738和RFC3986。在RFC1738标准下,只有字母数字、特殊字符“$-_.+!*'()”和可以使用用于其保留目的的保留字符被认为是安全的,不被编码,其他的字符一律会被编码。而在RFC3986标准下,只有字母数字、特殊字符“-_.~”和可以使用用于其保留目的的保留字符被认为是安全的,不被编码,其他的字符一律会被编码。
不过,不管是使用RFC1738标准,还是使用RFC3986标准,最后生成的字符串都是%+十六进制码的形式,而十六进制码参照US-ASCII对照表。如下:
http_build_query默认是使用RFC1738标准,这一点要特别注意。因为这和其他很多编程语言类似的功能不一样,比如,在Golang中url库就是使用RFC3986作为默认编码标准,如下:
如果你真的需要使用http_build_query来生成签名字符串,最好是在之后再使用urldecode方法解编码一下,生成明文的字符串。如下:
这样,一来可以避免因为不同语言造成的编码问题,二来有问题也更容易定位。