JS中的URL編碼和escape、encodeURI、encodeURIComponent

前言

在js使用url跳轉時,發現中文的添加到url中跳轉時是會被轉碼的,如我想要在url中傳中文值然後在頁面上JS使用location.href接收,比如我在chrome下訪問【https://www.baidu.com/?str=哈哈哈】,但是使用location.href取出的url是下面這樣的
這裏寫圖片描述
然後我在Edge下取出來的是這樣的
這裏寫圖片描述

我想要在JS中取到參數str的值,chrome下顯然不行,爲什麼會這樣呢?明明你們在瀏覽器的url地址欄中顯示的都是正常的啊!
這裏寫圖片描述

正文

URL只能傳輸ASCII字符

URL只能傳輸ASCII字符,URL包含漢字等傳輸時瀏覽器會自動進行十六進制編碼然後請求服務器,跳轉到頁面上時瀏覽器的URL地址欄中是包含漢字的,這是因爲它顯示時對URL進行了解碼顯示。至於爲什麼兩個內核下的瀏覽器使用相同的js代碼location.href顯示的卻是不一樣得到url,這是因爲Edge多做了一步解碼工作。

進行URL編碼操作

需求是傳遞url傳遞漢字,但是因爲url只能傳遞ASCII字符,所以傳遞時需要對url進行編碼(儘管瀏覽器會幫你做這一步),在頁面取時需要進行解碼來取出其中的非ASCII字符。

escape不用於URL編碼

JS中的escape函數在文檔中說的很清楚了:escape() 函數可對字符串進行編碼,這樣就可以在所有的計算機上讀取該字符串,Escape/Unescape加密解碼/編碼解碼,它是unicode編碼,並且編碼非ASCII字符時以%u開頭。

encodeURI不會對特殊符號進行編碼

說明
該方法不會對 ASCII 字母和數字進行編碼,也不會對這些 ASCII 標點符號進行編碼: - _ . ! ~ * ’ ( ) 。
該方法的目的是對 URI 進行完整的編碼,因此對以下在 URI 中具有特殊含義的 ASCII 標點符號,encodeURI() 函數是不會進行轉義的:;/?:@&=+$,#
使用
因爲不會對“?”等特殊符號進行轉義,所以我們使用時可以直接
encodeURI(location.href),而不用擔心?&字符被轉碼,要知道我們的傳遞參數是必須要有?&的。

encodeURIComponent

說明
1、該方法不會對 ASCII 字母和數字進行編碼,也不會對這些 ASCII 標點符號進行編碼: - _ . ! ~ * ’ ( ) 。
2、其他字符(比如 :;/?:@&=+$,# 這些用於分隔 URI 組件的標點符號),都是由一個或多個十六進制的轉義序列替換的。
使用
encodeURIComponent與encodeURI的區別在與encodeURIComponent會對?&等其它字符進行編碼,假設有一種場合:需要傳遞的參數裏有&字符,你使用encodeURI因爲不會對&進行編碼所有你的url會被&分割,所以你無論如何都不會取到的參數裏都不會包含&的。這時候就需要使用encodeURIComponent對&進行編碼。

var url='localhost:51288/index.aspx?str='+encodeURIComponent('&')

這樣你可以取到str的值然後進行decodeURIComponent()解碼就行了。

總結

當有一些特殊的url如其中的參數包含漢字、空格、特殊字符,可以使用encodeURI、encodeURIComponent對其進行編碼解碼操作。

發佈了51 篇原創文章 · 獲贊 30 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章