2015-03-25 105 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