自己的項目還好,合作接口神馬的傳值亂碼是很常見的。
遇到了幾次這種惡心情況,積累了一點經驗,有不對的地方歡迎指正。
亂碼原因:
一般來說,常用的編碼不是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 接收參數亂碼原理解析一:服務器端解碼原理