Request.QueryString獲取傳參中文亂碼


1.環境背景

  跨系統下載文件,文件系統的編碼為“GB2312”,下載系統通過文件路徑和文件名稱從文件系統中下載文件。

    文件系統web.config配置

      <globalization requestEncoding="gb2312" responseEncoding="gb2312"/>

  因涉及到中文文件名稱,所以添加了編碼解碼,但下載路徑仍存在亂碼。

  經查,傳入參數為(用UTF-8編碼):/SRVDownload.aspx?fileName=%e7%89%a9%e6%96%99%e9%9c%80%e6%b1%82201707082017080081607.xls&orgFileName=%e7%89%a9%e6%96%99%e9%9c%80%e6%b1%8220170708.xls

  但用Request.QueryString獲取,文件名稱卻變了(既不是GB2312,也不是UTF-8),因此無法解碼並下載文件:{fileName=%u9417%u2542%u67a1%u95c7%u20ac%u59f9%3f01707082017080081607.xls&orgFileName=%u9417%u2542%u67a1%u95c7%u20ac%u59f9%3f0170708.xls}

2.知識點 

  中文亂碼的原因往往是編碼方式和解碼方式不一致造成的。即用GB2312編碼,則需用GB2312解碼。

  Server.UrlEncode編碼是使用系統默認的,而System.Web.HttpUtility.UrlEncode可以指定編碼。

    HttpUtility.UrlEncode("物料清單",Encoding.UTF8);

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

3.解決方案

  Request.QueryString獲取的參數不知為何與傳入的編碼參數不一致,但要解決該問題,首先需要得到原始數據進行重新解碼來避免querystring亂碼,因此需直接讀取客戶端提交的字節數據進行轉換,最終得到完整的含中文名稱的路徑了。(從http://blog.sina.com.cn/s/blog_45ef30330100zhrw.html拷貝來的)

  Type type = Request.GetType(); 
  PropertyInfo property = type.GetProperty("QueryStringBytes", 
  BindingFlags.Instance  | BindingFlags.IgnoreCase | BindingFlags.NonPublic); 
  byte[] queryBytes = (byte[])property.GetValue(Request, null); 
  string querystring = HttpUtility.UrlDecode(queryBytes, Encoding.UTF8);

  獲得到完整的路徑后,就是對該路徑進行切割以取得參過來的參數,並進行相應的處理。

 


免責聲明!

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



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