python3 urlencode 和 urldecode 使用


# python3 urlencode 和 urldecode

## 故事背景

當我們在瀏覽器搜索內容時會發現瀏覽器會自動的將我們輸入的內容轉化為帶有 很多`%` 的地址如下所示:

> https://www.baidu.com/s?wd=%E4%B8%BA%E4%BB%80%E4%B9%88&rsv_spt=1&rsv_iqid=0xeaa7d7410002e421&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_dl=tb&rsv_sug3=9&rsv_sug1=11&rsv_sug7=101&rsv_sug2=0&rsv_btype=i&prefixsug=%25E4%25B8%25BA%25E4%25BB%2580%25E4%25B9%2588&rsp=5&inputT=2965&rsv_sug4=3444

那么為什么瀏覽器要這么做?這么做有什么用?

 

## 原因解析

在了解上面的問題前我們需要先搞清楚 URI、URL、以及URN

### 什么是URI、URL、URN

- URI(Uniform Resource Identifier:統一資源標識符): 用一個緊湊的字符串來表示抽象或物理資源。URI 只是規定如何擺哦是資源但是沒有規定如何獲取資源。

- URL(Uniform Resource Locator:統一資源定位符):URL是URI最常見的表現形式,它明確說明如何從一個精准、固定的位置獲取資源。URL不但規定了如何標識資源同時還規定了如何獲取資源

大部分URL都遵循一種標准格式這種格式包含三個部分:

- URL第一部分稱為方案(scheme),說明訪問資源所使用的協議類型,這部分通常就是 HTTP 協議(http://)
- 第二部分給出服務器的因特網地址 eg: www.taobao.com
- 其余部分指定了Web服務器上某個資源 eg: /robots.txt

- URN(Uniform Resource Name:統一資源名稱):URN作為特定內容的唯一名稱使用與目前的資源所在地無關,使用這些這些位置無關的URN就可以將資源到處搬遷

- 三者關系如圖所示:

![\[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-CucrwG90-1605039867773)(/Users/wollens/Library/Application Support/typora-user-images/image-20201111040232725.png)\]](https://img-blog.csdnimg.cn/20201111042525655.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0RhbmllbEphY2ta,size_16,color_FFFFFF,t_70#pic_center)


### 為什么瀏覽器要將我們輸入內容轉義

根據上面的內容我們了解到 URL 是資源定符,在URL中有些參數字符串是使用ke y=value 鍵值對的形式傳參鍵值對之間使用 `&` 符號分隔。

假設如果你的value中包含有 = 或者 &,那么將會導致接收URL的服務器解析錯誤導致無法獲取正確的資源,因此必須將引起歧義的 & 和 = 符號進行轉義也就是對其進行編碼。

又或者 URL 的編碼格式采用 ASCII 碼,而不是unicode,這也是就是說你不能在URL中包含任何非ASCII 字符,例如中文,否則如果客戶端瀏覽器和服務端瀏覽器支持的字符集不同中文可能會造成問題。

類似以上的情況還有很多場景這里就不一一舉例,為了避免上述問題瀏覽器默認對我們URL進行轉義。

 

### python urlencode 和 urldecode 的使用

在 python3 中將中文進行 urlencode urldecode 編碼需要使用 urllib 這個庫

- urlencode

```python
import urllib

urllib.parse.quote(string, safe='/', encoding=None, errors=None)
```

 

- urldecode

```python
import urllib

urllib.parse.unquote(string, encoding='utf-8', error='replace')
```

 

- 使用實例

```python
import urllib

urllib.parse.quote('打工人')
>>> '%E6%89%93%E5%B7%A5%E4%BA%BA'

urllib.parse.unquote('%E6%89%93%E5%B7%A5%E4%BA%BA')
>>> '打工人'
```

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM