2015-03-25 106 views
1

我有下面的代码片段:额外的转义字符

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包似乎添加%附近的一个额外的转义字符标志。对于例如上述打印语句的输出如下:

2015/03/25 12:02:49 url http://localhost:9000/pools/default/buckets/test%2525?bucket_uuid=7864b0dcdf0a578bd0012c70aef58aca 

这似乎只发生在设置URL的RawQuery字段时。任何想法为什么发生这种情况?我使用的是去版本1.3.3

干杯, 马尼克

+0

有了 “额外的”,你的意思是你'%2525',而不是预期的'%25'? – ANisus 2015-03-25 09:29:50

回答

4

URL可能只包含ASCII字符集字符,但它往往是指包括该ASCII字符集之外/传输字符。在这种情况下,URL必须转换为有效的ASCII格式。

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

由于您的未加工网址包含字符'%',因此将被替换为"%25"

回到你的例子:在打印的表格中你看到"%2525"。你可以问为什么不只是"%25"

这是因为你原来的URL包含在其逃脱形式,这意味着它的原料形式包含转义序列"%25"一个'%'。如果您使用/理解为原始输入,'%'将被替换为"%25",输入"25"后将输入"%2525"

参见:HTML URL Encoding Reference

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

而且也:RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax

+0

非常好,谢谢你的详细解答。 – 2015-03-25 16:09:02