我有以下代码片段:
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())
Run Code Online (Sandbox Code Playgroud)
我看到当 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
Run Code Online (Sandbox Code Playgroud)
这似乎仅在设置 URL 的 RawQuery 字段时才会发生。知道为什么会发生这种情况吗?我使用的是 go 版本 1.3.3
干杯,马尼克
URL 可能仅包含 ASCII 字符集的字符,但通常旨在包含/传输此 ASCII 集之外的字符。在这种情况下,必须将 URL 转换为有效的 ASCII 格式。
如果原始URL 包含允许的字符集之外的字符,则会对它们进行转义:将它们替换为'%'后跟两个十六进制数字。因此该字符'%'很特殊,也必须进行转义(其转义形式也以 开头'%',其十六进制代码为25)。
由于您的原始URL 包含该字符'%',因此它将被替换为"%25"。
回到您的示例:在打印的表格中您会看到"%2525". 你可能会问为什么不只是"%25"?
这是因为您的原始 url 包含转义'%'形式的a ,这意味着它的原始形式包含转义序列。如果您使用/解释它作为原始输入,则将会被替换为,后跟来自输入的 ,从而导致。"%25"'%'"%25""25""%2525"
请参阅:HTML URL 编码参考
还有:RFC 3986 - 统一资源标识符 (URI):通用语法