北屋教程网

专注编程知识分享,从入门到精通的编程学习平台

你就这么直接使用http_build_query,有考虑过它的问题吗?

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方法解编码一下,生成明文的字符串。如下:

这样,一来可以避免因为不同语言造成的编码问题,二来有问题也更容易定位。

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言