我有以下代码片段:
u := *baseURL
u.User = nil
if q := strings.Index(path, "?"); q > 0 {
u.Path = path[:q]
u.RawQuery = path[q+1:]
} else {
u.Path = path
}
log.Printf(" url %v, u.String())
我看到当baseurl设置为http://localhost:9000/buckets/test%?bucket_uuid=7864b0dcdf0a578bd0012c70aef58aca这样的内容时,url包似乎在%符号附近添加了一个额外的转义字符。例如上面的print语句的输出如下:
2015/03/25 12:02:49 url http://localhost:9000/pools/default/buckets/test%2525?bucket_uuid=7864b0dcdf0a578bd0012c70aef58aca
这似乎仅在设置URL的RawQuery字段时发生。知道为什么会这样吗?我正在使用1.3.3版
干杯, 马尼克
Best Answer-推荐答案 strong>
URL只能包含ASCII字符集的字符,但通常旨在包含/传输此ASCII字符集之外的字符。在这种情况下,必须将URL转换为有效的ASCII格式。
如果原始URL包含的字符超出了允许的范围,则会对其进行转义:将它们替换为'%' ,后跟两个十六进制数字。因此,字符'%' 是特殊字符,还必须进行转义(其转义形式也将以'%' 开头,其十六进制代码为25 )。
由于您的原始URL包含字符'%' ,因此它将被"%25" 代替。
回到您的示例:在打印的表单中,您看到"%2525" 。您可能会问为什么不只是"%25" ?
这是因为您的原始网址包含转义形式的'%' ,这意味着其原始格式包含转义序列"%25" 。如果您将其用作原始输入/解释,则'%' 将替换为"%25" ,其后将跟着输入中的"25" ,从而生成"%2525" 。
另请:HTML URL Encoding Reference
另外:RFC 1738 - Uniform Resource Locators (URL)
并且:RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax
关于url - Go URL中的多余转义字符,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/29249900/
|