axios源碼日記(一)

helper文件夾

文件夾結構與對應功能

image

buildURL.js

主要知識點:encodeURI和encodeURIComponenthtml

涉及代碼片斷瀏覽器

function encode(val) {
  return encodeURIComponent(val).
    replace(/%40/gi, '@').
    replace(/%3A/gi, ':').
    replace(/%24/g, '$').
    replace(/%2C/gi, ',').
    replace(/%20/g, '+').
    //Using square bracket notation for URL params
    replace(/%5B/gi, '[').
    replace(/%5D/gi, ']');
}
複製代碼

encodeURI

encodeURI : encodeURI函數經過將特定字符的每一個實例替換爲一個、兩個、三或四轉義序列來對統一資源標識符 (URI) 進行編碼 (該字符的 UTF-8 編碼僅爲四轉義序列,由兩個 "代理" 字符組成)。app

在URI中,有一些字符會被%進行編碼,維基百科中的介紹爲:百分號編碼(英語:Percent-encoding,又稱:URL編碼(英語:URL encoding)),是特定上下文的統一資源定位符 (URL)的編碼機制. 實際上也適用於統一資源標誌符(URI)的編碼。也用於爲application/x-www-form-urlencodedMIME準備數據,由於它用於經過HTTP的請求操做(request)提交HTML表單數據。函數

encodeURI忽略協議前綴('http://')和域名部分。ui

不會被編碼的字符包括如下:編碼

類型 包含
保留字符 ; , / ? : @ & = + $
非轉義的字符 字母 數字 - _ . ! ~ * ' ( )
數字符號 #

其餘字符都會被%進行編碼,例如:中國ママ等非以上列舉的字符。url

值得一提的是,URI的規範現遵循較新的標準RFC3986,包含的保留字符又增長了:spa

! * ' ( ) ; : @ & = + $ , / ? # [ ]代理

新增的 [] 是爲IPv6而被保留的。所以,除了上述字符之外,URI中的其它字符必須用百分號編碼。code

編碼對應值
! # $ % & ' ( ) * + , / : ; = ? @ [ ]
%21 %23 %24 %25 %26 %27 %28 %29 %2A %2B %2C %2F %3A %3B %3D %3F %40 %5B %5D

encodeURIComponent

encodeURIComponent()是對統一資源標識符(URI)的組成部分進行編碼的方法。它使用一到四個轉義序列來表示字符串中的每一個字符的UTF-8編碼(只有由兩個Unicode代理區字符組成的字符才用四個轉義字符編碼)。

乍一看是否是和encodeURI沒啥區別呢~,可是這個API強調的是:「對URI組成部分進行編碼的方法」,這個方法會轉義除了字母、數字( ) . ! ~ * ' -和_以外的全部字符。包含上述介紹中的一些encodeURI不會進行轉義的字符。 具體說這個兩個方法以前有個結論:

  1. encodeURIComponent()適合用來編碼咱們的URI的queryString部分,而後拼接到URI的其餘部分。
  2. 若是使用encodeURIComponent()來對URI進行編碼,那麼它將不會用做一個有效URI
  3. 編碼一個有效URI,請使用encodeURI
  4. 根據上述講述,encodeURI不編碼queryString或哈希值(#),所以,須要編碼除協議和域名外的部分,使用若是使用encodeURIComponent()

使用

其實,咱們的常見問題是特殊字符和空格,有些時候沒法避免在queryString中帶有一些特殊字符(中文就是一種……),這個時候咱們就須要使用encodeURIComponent()來轉義queryString,而後與URL的其餘部分拼接起來。可是鑑於大多數瀏覽器會自動將空格等字符轉換爲%編碼的URL編碼值,但始終在一小部分瀏覽器中存在異常(IE會出現異常,重現率100%)。幸運的是,瀏覽器提供本機URL編碼和解碼功能:encodeURI,encodeURIComponent。那麼,相應的,decodeURI,decodeURIComponent就是用來解碼已經編碼的內容的方法。
相關文章
相關標籤/搜索