Golang url 參數編碼與解碼

package main

import (
"fmt"
"net/url"
)

func main() {
urltest := "http://www.baidu.com/s?wd=自由度"
fmt.Println(urltest)
encodeurl:= url.QueryEscape(urltest)
fmt.Println(encodeurl)
decodeurl,err := url.QueryUnescape(encodeurl)
if err != nil {
fmt.Println(err)
}
fmt.Println(decodeurl)
}



輸出結果:
http://www.baidu.com/s?wd=自由度
http%3A%2F%2Fwww.baidu.com%2Fs%3Fwd%3D%E8%87%AA%E7%94%B1%E5%BA%A6
http://www.baidu.com/s?wd=自由度



常在處理網址的人應該會發現某些網址在從瀏覽器複製下來之後,就會變成一些百分比加上十六進位碼的奇怪網址,而貼回去瀏覽器又變正常了,就個就是網址 URL 百分比編碼的問題。

網址 URL 百分比編碼
在 RFC 3986 標準中規範一些 URI 的保留字元(reserved characters),若網址中出現這些保留字元時,就必須把這些保留字元轉為百分比編碼的表示方式,例如:!、#、: 與 & 等。

百分比編碼的規則就是把字元的 ASCII 碼以十六進位表示,前方再加上一個百分比符號,例如井字號 # 的 ASCII 碼是 0x23,所以經過百分比編碼轉換之後,就是 %23。

若是遇到非 ASCII 的字元(例如中文字),則會將資料以 UTF-8 的編碼方式表示成一連串的位元組序列,再將每個位元組以百分比編碼的方式進行編碼。

關於網址的百分比編碼介紹,可以參考維基百科的 Percent-encoding 說明。

平常最常會遇到的網址百分比編碼的地方就是瀏覽器的網址列,當我們在用 Google 搜尋後,若想要把網址複製起來,有時候就會遇到這種編碼問題:


雖然在瀏覽器的網址列中看到的中文字是正常顯示的,但是如果將這串文字複製起來,貼在一般的文字編輯器時,就會出現這樣經過編碼的 URL 網址:

https://www.google.com.tw/search?q=%E4%B8%AD%E6%96%87

原本網址的中文兩個字,在這裡變成了 %E4%B8%AD%E6%96%87,就這是因為瀏覽器在使用者複製網址時,自動把網址經過一道百分比編碼轉換了,事實上這才是標準的網址寫法。

HTML 的 form 表單在用 GET 或 POST 等管道送出資料時(content-type 為 application/x-www-form-urlencoded),其欄位名稱以及資料內容也會經過百分比編碼,不過在編碼規則上有一些小改變(請參考 W3C 網站),最常見的差異就是原本的空白字元會被編碼成 %20,而在這裡就會轉為加號 +。

這個差異在瀏覽器的網址列就可以時常看到,當我們在 Google 搜尋含有空白的關鍵字時,網址會變成這樣:


在 HTTP 的 GET 參數中的空白會被瀏覽器轉換為加號 +,所以 Google 搜尋 ubuntu linux 的網址會變成這樣:

https://www.google.com.tw/search?q=ubuntu+linux
簡單來說,在網址中問號 ? 左邊的空白會轉換成 %20,而右邊的空白則會轉換成 +。

程式語言編年史

程式語言編年史原文 下面這張圖片描繪了整個程式語言的歷史。包括各種程式語言的發明人、程式語言的特點和適用領域、被什麼網站或公司使用等 (檢視 完整高清圖 )。 之所以會有那麼多不同的程式語言是因為設計程式語言的初衷不同、對語言學習曲線的追求不同、不同程式之間的執行成本差異...