033 Url中特殊字符的处理
在url跳轉頁面的時候,參數值中的#不見了,一直沒有處理,今天有空看了一下,后來發現后臺的過濾器之類的都沒有處理,就比較奇怪了,原來是特殊字符的問題。
一:Url中的特殊字符
1.說明
這里還是需要做到一個眼熟的,遇到的時候可以快速定位到。
具體現象就是?用URL傳參數的時候,用&符號連接,如果某一個參數中含"#$ ^ & * + ="這些符號的時候,在另一個頁面getParameter就會取不到傳過來的參數。
?
2.特殊字符
?
3.特殊字符的含義
空格換成加號(+)
正斜杠(/)分隔目錄和子目錄
問號(?)分隔URL和查詢
百分號(%)制定特殊字符
#號指定書簽
&號分隔參數
?
4.為啥要編碼
通常如果一樣東西需要編碼,說明這樣東西并不適合傳輸。原因多種多樣,如Size過大,包含隱私數據,對于Url來說,之所以要進行編碼,是因為Url中有些字符會引起歧義。
例如Url參數字符串中使用key=value鍵值對這樣的形式來傳參,鍵值對之間以&符號分隔,如/s?q=abc& ie=utf-8。如果你的value字符串中包含了=或者&,那么勢必會造成接收Url的服務器解析錯誤,因此必須將引起歧義的&和= 符號進行轉義,也就是對其進行編碼。
又如,Url的編碼格式采用的是ASCII碼,而不是Unicode,這也就是說你不能在Url中包含任何非ASCII字符,例如中文。否則如果客戶端瀏覽器和服務端瀏覽器支持的字符集不同的情況下,中文可能會造成問題。
Url編碼的原則就是使用安全的字符(沒有特殊用途或者特殊意義的可打印字符)去表示那些不安全的字符。
?
5.Url可以使用的字符
RFC3986文檔規定,Url中只允許包含英文字母(a-zA-Z)、數字(0-9)、- _ . ~ 4個特殊字符以及所有保留字符。
?
6.保留字符
?
7.不安全字符
還有一些字符,當他們直接放在Url中的時候,可能會引起解析程序的歧義。這些字符被視為不安全字符,原因有很多。
?
二:JS處理
1.escape,encodeURI和encodeURIComponent的區別
Javascript中提供了3對函數用來對Url編碼以得到合法的Url,它們分別是escape / unescape,encodeURI / decodeURI和encodeURIComponent / decodeURIComponent。由于解碼和編碼的過程是可逆的,因此這里只解釋編碼的過程。
這三個編碼的函數——escape,encodeURI,encodeURIComponent——都是用于將不安全不合法的Url字符轉換為合法的Url字符表示,它們有以下幾個不同點。
?
2.其安全字符
就是不會編碼的字符
?
3.對Unicode的編碼不同
這三個函數對于ASCII字符的編碼方式相同,均是使用百分號+兩位十六進制字符來表示。
但是對于Unicode字符,escape的編碼方式是%uxxxx,其中的xxxx是用來表示unicode字符的4位十六進制字符。這種方式已經被W3C廢棄了。但是在ECMA-262標準中仍然保留著escape的這種編碼語法。
encodeURI和encodeURIComponent則使用UTF-8對非ASCII字符進行編碼,然后再進行百分號編碼。這是RFC推薦的。因此建議盡可能的使用這兩個函數替代escape進行編碼。
?
4.小實驗
?
三:總結
今天遇到的問題,查了一下,還是更適合使用encodeURIComponent()
當決定使用哪個函數的時候,還需要查一下其安全字符。
?
轉載于:https://www.cnblogs.com/juncaoit/p/9708114.html
總結
以上是生活随笔為你收集整理的033 Url中特殊字符的处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华夏银行易达金可以提前还款吗?提前还款手
- 下一篇: 招商银行个人网上银行怎么登录?登录网银步