前幾天在調程序的時候遇到了比較郁悶的問題我用URL從一個頁面傳遞字符串到另一個頁面的時出現了個奇怪的問題我要傳遞的字符串是DK+中繼站可是另一個頁面接收到字符串卻是DK 中繼口加號變成了空格站不能解析出來變成了不能識別的符號口
我上網查找了原因URL中有些字符被轉義比如空格被編碼成加號於是傳的參數明明是加號獲取的值卻成了空格
按照網上的建議我們應該對要傳遞的參數進行編碼處理於是我對傳遞的參數進行了處理但是又衍生了一堆問題出來我當時為了節約時間就沒有仔細研究用了字符串中的Replace()方法在傳送前代替了這兩個字符接收到了再代替回來現在我來具體的展示下這個問題
首先我們先看下我的開始的問題(環境VS) 新建一個網站在其中添加一個頁面一個頁面是Defaulaspx另一個頁面Defaulaspx在第一個頁面中添加一個控件HyperLink後台代碼
在第二個頁面中添加一個Label控件Label後台代碼
結果顯示DK 中繼口
我當時的解決方法用了字符串中的Replace()方法在傳送前代替了這兩個字符接收到了再代替回來
第一個頁面的後台代碼第二個頁面中後台代碼
結果是DK+中繼站正確!
後來我在網上找到這個這樣的設置在nfig中設置
這樣的話就不需要替代中文了只需要把+替代中文在這個過程就不會出現問題了
但是這樣的傳遞中文可能還會遇到其他中文字出問題最好是采用下面的方法將中文參數編碼
我采用URLEncode()編碼采用URLEncode()不在nfig中設置好像也可以在我的測試中沒有問題但是為了安全我們還是添加上上面的設置
頁面上都是一致的第一頁面的後台代碼第二個頁面中後台代碼
結果是DK+中繼站正確!
後來我在網上找到這個這樣的設置在nfig中設置
這樣的話就不需要替代中文了只需要把+替代中文在這個過程就不會出現問題了
但是這樣的傳遞中文可能還會遇到其他中文字出問題最好是采用下面的方法將中文參數編碼
我采用URLEncode()編碼采用URLEncode()不在nfig中設置好像也可以在我的測試中沒有問題但是為了安全我們還是添加上上面的設置
頁面上都是一致的第一頁面的後台代碼
第二頁面的後台代碼
結果是DK+中繼站正確!
注意一定要前後對應比如在這裡第一頁面中是先編碼的後替代第二頁面中就要先替代再解碼不然就會出錯如DK 中繼站
我在開頭提到遇到了比較多的問題 網上的資料有的說是用%來替代+但是我嘗試了下結果卻是錯誤的 DK 中繼站這是什麼原因呢?是網上說錯了嗎?但是在下面的情況中又很讓我苦笑不得不知道具體是什麼原因
接上面還是用%來替代+我在一次錯誤的輸入在第一頁面後台輸入了name = ServerUrlEncode(name)第二頁面中解碼是 name = ServerHtmlDecode(name)居然是結果對的DK+中繼站我換了其他的替代字符結果也是正確的
但是我換了其他編碼和解碼組合ServerHtmlEncode(name)和ServerUrlDecode(name)或者ServerHtmlEncode(name)和ServerHtmlDecode(name)組合結果就不對連中文都不對DK 中繼口
我采用ServerHtmlEncode(name)和ServerHtmlDecode(name)組合要得到正確的結果必須用像@這樣的特殊字符來替代+當然還有在nfig中添加設置設置內容如上
我在查資料的時候還有提到一種方法不需要在nfig中添加設置在aspx文件中添加<meta httpequiv=ContentType content=text/html charset=gb>我嘗試了沒成功
我還有個疑問是在這裡我是用@的特殊字符來代替+因為在我的字符串中是不可能出現@才這樣做的但是如果我的字符串中可能出現這些特殊字符串我又該如何替代呢?
我在經歷了這些測試後覺得最安全的方法在URL中傳遞參數時最好還是使用URLDecode()方法在nfig中配置上
配置這個是需要注意你的程序中的字符集是不是也用這個gb來編碼解碼的如果不是就要注意了可能引發的錯誤了我在程序中就遇到了這個問題我的程序中的畫面就是用xml傳遞的我加了這個設置後就不能顯示畫面我找了很長時間才知道是是兩種編碼規則沖突我畫面中設置的UTF被全局變量復制了
今天理解到了測試時需要很有耐心的在這個問題中正確的方法就是可能就是一兩種但是為了測試錯誤的情況我做了七八種情況比如URLEncodeURLDecode和HtmlEncodeHtmlDecode的組合問題傳遞時和接收時編碼替代解碼的先後順序這些花了很多時間頭都繞暈了本來想把所以的過程都寫出來的但是考慮到篇幅太多了還是就寫這些希望大家能有好的建議
From:http://tw.wingwit.com/Article/program/net/201311/12023.html