URL的傳遞字串問題小研究

2022-09-02 17:36:08 字數 2539 閱讀 9664

前幾天在調程式的時候遇到了比較鬱悶的問題,我用url從乙個頁面傳遞字串到另乙個頁面的時,出現了個奇怪的問題,我要傳遞的字串是「dk51+700中繼站」;可是另乙個頁面接收到字串卻是:「dk51 700中繼口」;加號變成了空格,「站」不能解析出來,變成了不能識別的符號「口」。

我上網查詢了原因:url中有些字元被轉義,比如空格被編碼成加號,於是傳的引數明明是加號,獲取的值卻成了空格。

按照網上的建議,我們應該對要傳遞的引數進行編碼處理。於是,我對傳遞的引數進行了處理,但是又衍生了一堆問題出來;我當時為了節約時間,就沒有仔細研究,用了字串中的replace()方法在傳送前代替了這兩個字元,接收到了再代替回來。現在我來具體的展示下這個問題。

1.首先,我們先看下我的開始的問題(環境:vs2008):1.1. 新建乙個**,在其中新增乙個頁面,乙個頁面是defaul.aspx,另乙個頁面defaul2.aspx,在第乙個頁面中新增乙個控制項:hyperlink1;後台**:

1.2. 在第二個頁面中新增乙個label控制項label1;後台**:

1.3. 結果顯示:「dk51 700中繼口」。

2.我當時的解決方法:用了字串中的replace()方法在傳送前代替了這兩個字元,接收到了再代替回來。

2.1第乙個頁面的後台**:2.2.第二個頁面中,後台**:

2.3.結果是:「dk51+700中繼站」。正確!

後來我在網上找到這個這樣的設定,在web.config中設定:

這樣的話,就不需要替代中文了,只需要把「+」替代,中文在這個過程就不會出現問題了。

但是這樣的傳遞中文可能還會遇到其他中文字出問題,最好是採用下面的方法將中文引數編碼。

3. 我採用urlencode()編碼,採用urlencode()不在web.config中設定好像也可以,在我的測試中沒有問題,但是為了安全,我們還是新增上上面的設定。

3.1.頁面上都是一致的,第一頁面的後台**:3.2.第二個頁面中,後台**:

3.3.結果是:「dk51+700中繼站」。正確!

後來我在網上找到這個這樣的設定,在web.config中設定:

這樣的話,就不需要替代中文了,只需要把「+」替代,中文在這個過程就不會出現問題了。

但是這樣的傳遞中文可能還會遇到其他中文字出問題,最好是採用下面的方法將中文引數編碼。

我採用urlencode()編碼,採用urlencode()不在web.config中設定好像也可以,在我的測試中沒有問題,但是為了安全,我們還是新增上上面的設定。

4.1.頁面上都是一致的,第一頁面的後台**:

4.2 第二頁面的後台**:

4.3 結果是:「dk51+700中繼站」。正確!

注意:一定要前後對應,比如在這裡,第一頁面中是先編碼的,後替代,第二頁麵中就要先替代,再解碼,不然就會出錯,如:「dk51 700中繼站」

我在開頭提到,遇到了比較多的問題:1. 網上的資料有的說是用「%20」來替代「+」,但是我嘗試了下,結果卻是錯誤的: 「dk51 700中繼站」,這是什麼原因呢?是網上說錯了嗎?但是在下面的情況中,又很讓我苦笑不得,不知道具體是什麼原因。

2. 接上面,還是用「%20」來替代「+」;我在一次錯誤的輸入,在第一頁面後台輸入了name = server.urlencode(name);第二頁麵中解碼是 name = server.htmldecode(name);居然是結果對的,「dk51+700中繼站」。我換了其他的替代字元,結果也是正確的。

但是我換了其他編碼和解碼組合:server.htmlencode(name)和server.urldecode(name),或者server.htmlencode(name)和server.htmldecode(name)組合,結果就不對。連中文都不對:「dk51 700中繼口」。

3. 我採用server.htmlencode(name)和server.htmldecode(name)組合,要得到正確的結果,必須用像「@」這樣的特殊字元來替代「+」,當然還有在web.config中新增設定,設定內容如上。

4. 我在查資料的時候還有提到一種方法;不需要在web.config中新增設定,在aspx檔案中新增:我嘗試了,沒成功。

5. 我還有個疑問是,在這裡,我是用「@」的特殊字元來代替「+」,因為在我的字串中是不可能出現「@」,才這樣做的。但是如果我的字串中可能出現這些特殊字串,我又該如何替代呢?

6. 我在經歷了這些測試後,覺得最安全的方法,在url中傳遞引數時,最好還是使用urldecode()方法。在web.config中配置上

配置這個是需要注意,你的程式中的字符集是不是也用這個「gb2312」來編碼解碼的,如果不是,就要注意了可能引發的錯誤了。我在程式中就遇到了這個問題,我的程式中的畫面就是用xml傳遞的,我加了這個設定後,就不能顯示畫面,我找了很長時間,才知道是是兩種編碼規則衝突。我畫面中設定的utf-8,被全域性變數複製了。

今天理解到了測試時需要很有耐心的,在這個問題中,正確的方法就是可能就是一兩種,但是為了測試錯誤的情況,我做了七八種情況,比如urlencode,urldecode和htmlencode,htmldecode的組合問題,傳遞時和接收時,編碼,替代,解碼,的先後順序。這些花了很多時間,頭都繞暈了,本來想把所以的過程都寫出來的,但是考慮到篇幅太多了,還是就寫這些。希望大家能有好的建議。

SendMessage 傳遞字串

sendmessage函式的原型為 lresultsendmessage hwndhwnd,uintmsg,wparamwparam,lparamlparam 用於訊息傳遞,其中有wparam 和 lparam 兩個附加引數,可以傳遞一些附加資訊,由於它們是long 型的,所以只能 傳遞數字,如果想...

C C 字串傳遞

可以說新手使用p invoke最開始的頭疼就是c 和c 的字串傳遞,因為這裡涉及到兩個問題。第一 c 的string和c 的字串首指標如何對應。第二 字串還有ansi和unicode 寬字串 之分。第一 字串指標當輸入引數,第二 字串指標作為返回值,第三 字串指標作為輸入輸出引數。c 部分的測試 很...

傳遞字串 Linux Shell 傳遞引數

物聯網開發入門直播課 嵌入式 物聯網 快速上手linux 創客學院直播室 www.makeru.com.cn 嵌入式應用層開發 1小時全面認識linux網路經典案例 創客學院直播室 www.makeru.com.cn 我們可以在執行 shell 指令碼時,向指令碼傳遞引數,指令碼內獲取引數的格式為 ...