此文首發於
最近在工作中遇到乙個bug:
新增或者編輯標籤時,輸入框失焦時需要校驗標籤名是否與已有標籤名重複,而標籤名只有字數限制(1-10個字元)。
校驗的介面是get請求,當標籤名以「#」、「&」結尾時,會出現一點小問題:比如已存在名為「aa」的標籤,當輸入「aa#」或「aa&」(這兩個標籤名不存在)失焦校驗時,後台返回「該標籤名已存在」,不應該啊,明明沒有這個標籤名呀???
首先想到的是列印一下輸入框的值和傳給後台的標籤名,列印結果跟我輸入的一樣,嗯,那不是這裡出問題
然後f12開啟開發者工具,發現失焦呼叫介面時,傳的引數不是我填入的值,問題就出現在這兒了:以「#」結尾傳的參是「aa」:
[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-t2wdb2vg-1572632614909)(jsencode/pic11.png)]
以「&」結尾傳的參是「aa」,還莫名多了乙個空字段的引數,值也為空:
[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-fh0qx0mm-1572632614910)(jsencode/pic1.png)]
想必這應該是http協議的問題,網上查閱了一番,參考原文講解了url的組成,舉例乙個url:
著重看第6、7條就能明白為什麼以「#」和「&」結尾會出問題。「#」後面是錨,http自動去掉了「#」;「&」是引數分隔符,自然就多出了乙個空欄位,值也為空。從上面的url可以看出,乙個完整的url包括以下幾部分:
1、協議部分:該url的協議部分為「http:」,這代表網頁使用的是http協議。在internet中可以使用多種協議,如http,ftp等等本例中使用的是http協議。在"http"後面的「//」為分隔符
2、網域名稱部分:該url的網域名稱部分為「www.shibazi.com」。乙個url中,也可以使用ip位址作為網域名稱使用
3、埠部分:跟在網域名稱後面的是埠,網域名稱和埠之間使用「:」作為分隔符。埠不是乙個url必須的部分,如果省略埠部分,將採用預設埠80
4、虛擬目錄部分:從網域名稱後的第乙個「/」開始到最後乙個「/」為止,是虛擬目錄部分。虛擬目錄也不是乙個url必須的部分。本例中的虛擬目錄是「/news/」
5、檔名部分:從網域名稱後的最後乙個「/」開始到「?」為止,是檔名部分,如果沒有「?」,則是從網域名稱後的最後乙個「/」開始到「#」為止,是檔案部分,如果沒有「?」和「#」,那麼從網域名稱後的最後乙個「/」開始到結束,都是檔名部分。本例中的檔名是「index.asp」。檔名部分也不是乙個url必須的部分,如果省略該部分,則使用預設的檔名
6、錨部分:從「#」開始到最後,都是錨部分。本例中的錨部分是「name」。錨部分也不是乙個url必須的部分
7、引數部分:從「?」開始到「#」為止之間的部分為引數部分,又稱搜尋部分、查詢部分。本例中的引數部分為「boardid=5&id=24618&page=1」。引數可以允許有多個引數,引數與引數之間用「&」作為分隔符。
參考原文
escape(uristring) 該方法不會對ascii字母和數字進行編碼,也不會對下面這些 ascii 標點符號進行編碼: * @ - _ + . / ,其他所有的字元都會被轉義序列替換。返回值是已編碼的string的副本,其中某些字元被替換成了十六進製制的轉義序列。
那就用這個吧,但是後台對於人民幣符號「¥」並不能解碼,那就試試其他的吧。
參考原文
encodeuri(uristring) 該方法不會對ascii字母和數字進行編碼,也不會對這些 ascii 標點符號進行編碼: - _ . ! ~ * 』 ( ) 。該方法的目的是對 uri 進行完整的編碼,因此對以下在uri中具有特殊含義的ascii標點符號,encodeuri()函式是不會進行轉義的:;/??&=+$,#
這個方法更不能用啦
參考原文
encodeuricomponent(uristring) 該方法不會對ascii字母和數字進行編碼,也不會對這些ascii標點符號進行編碼: - _ . ! ~ * 』 ( ) 。其他字元(比如 :;/??&=+$,# 這些用於分隔uri元件的標點符號),都是由乙個或多個十六進製制的轉義序列替換的。
誒,這個正是我需要的,試試這個,結果讓人很滿意,中英文的所有標點符號特殊字元都能進行編碼。
js 字串編碼轉換函式
escape 方法 對 string 物件編碼以便它們能在所有計算機上可讀,escape charstring 必選項 charstring 引數是要編碼的任意 string 物件或文字。說明 escape 方法返回乙個包含了 charstring 內容的字串值 unicode 格式 所有空格 標點...
字串編碼
1.unicode 的編碼方式 編碼類似1小時和60分鐘的關係,本質的時間刻度還是相同的。unicode 編碼有 utf 8 utf 16 和 utf 32 它們都是將數字轉換到程式資料的編碼方案。utf 8 以位元組為單位。表示乙個字元時,能用乙個位元組就不用兩個或者三個位元組表示。utf 16 ...
js 字串減去字串 js 減去字串
redd.config裡面的時間戳和隨機字串是哪個簽名的時間戳和隨機字串 貼給你,你就明白拉。前台js獲取timestamp var d new date var timestamp date.parse d 當前日期減去1970年1月1號的值 後台獲取簽名,即signature,其中nocestr...