【亂碼】Request QueryString 編碼,傳值亂碼的幾種情況和解決辦法(單頁,多頁)


自己的項目還好,合作接口神馬的傳值亂碼是很常見的。

遇到了幾次這種惡心情況,積累了一點經驗,有不對的地方歡迎指正。

 

亂碼原因:

一般來說,常用的編碼不是utf-8就是gb2312,一樣的 HttpUtility.URLEncode("北京"),

gb2312編出來是這樣:%B1%B1%BE%A9

utf-8編出來是這樣:%E5%8C%97%E4%BA%AC

所以他們格式不一樣的解碼必然導致亂碼,

別說是頁面間傳值了,就算是var str= Server.UrlDecode(Server.UrlEncode("北京")); 這樣也有可能出現亂碼。WHY?

1.Request.QueryString[key]、Request.Form[key]、Server.UrlDecode(),解碼方式獲取是一致的,都是優先從HTTP請求頭(x-up-devcap-post-charset或者charset)獲取編碼,如果沒指定的話從取配置文件的Globalization結點獲取,都沒有默認Encoding.UTF8。

2.Request.QueryString[key]、Request.Form[key]默認都會調用函數HttpUtility.UrlDecode(str, encoding),如果HTTP請求的數據只經過一次編碼,無需再調用解碼函數;Request.Cookies[key]沒用調用解碼函數,獲取到值后需要調用正確的解碼函數才能得到正確的值。

3.Server.UrlEncode()解碼方式,優先從取配置文件的Globalization結點獲取,如果配置文件沒有的話用Encoding.Default,最后默認用Encoding.UTF8。

 

 

解決辦法:

確認請求方和接收方的編碼格式一致。

只要接收方和請求方的編碼格式一樣就可以。

在web.config里 <configuration>標簽中的<system.web>里,指定:requestEncoding

整個項目的指定:

 <system.web>
      <globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="zh-CN" fileEncoding="utf-8" />

 </system.web>


單個頁面的指定:

< location path="bu.aspx">   
<!--
            path是頁面路徑
 -->
< system.web> < globalization fileEncoding="utf-8" requestEncoding="utf-8" responseEncoding="utf-8"/> < /system.web> < /location>

 


診斷依據:

引起亂碼原因很多,不是所有情況都需要修改配置文件,那什么時候需要修改web.config呢?

以“北京”的gb2312編碼為例

比如:   傳來的Querystring是 city=%B1%B1%BE%A9 

    頁面接收的 Querystring["city"] 也是 %B1%B1%BE%A9 

    那很可能是Decode解碼的問題,無需改web.config。

比如: 傳來的Querystring是 city=%B1%B1%BE%A9 

    頁面收到的 Querystring["city"] 卻變成 %u92BD%u9D95%u7306(類似這種,這只是例子)

    明顯編碼就不一樣了好伐!這種收到時候未經處理(指自己手動處理)編碼改變的情況,一般需要修改web.config設置。

 

參考:Request 接收參數亂碼原理解析一:服務器端解碼原理

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM