go URL中的额外转义字符

时间:2015-03-25 07:37:07

标签: url go

我有以下代码片段:

    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字段时。知道为什么会这样吗?我正在使用go 1.3.3版本

干杯, 马尼克

1 个答案:

答案 0 :(得分:4)

URL只能包含ASCII字符集的字符,但通常用于包含/传输此ASCII集之外的字符。在这种情况下,必须将URL转换为有效的ASCII格式。

如果 raw URL包含允许集之外的字符,则会对其进行转义:它们将替换为'%'后跟两个十六进制数字。因此,字符'%'是特殊的,也必须进行转义(其转义形式也将以'%'开头,其十六进制代码为25)。

由于您的原始网址包含字符'%',因此它将被"%25"替换。

回到您的示例:在打印表单中,您会看到"%2525"。你可以问为什么不只是"%25"

这是因为您的原始网址在其转义表单中包含'%',这意味着其 raw 表单包含转义序列"%25"。如果您使用/将其解释为原始输入,则'%'将替换为"%25",后面会输入"25"因此导致"%2525" {1}}。

请参阅:HTML URL Encoding Reference

另外:RFC 1738 - Uniform Resource Locators (URL)

还有:RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax