zoukankan      html  css  js  c++  java
  • 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);

      获得到完整的路径后,就是对该路径进行切割以取得参过来的参数,并进行相应的处理。

  • 相关阅读:
    logistics regression
    dir 以及 attrib
    python 爬取有道翻译
    spss 逐步回归
    JQuery传值给.ashx乱码
    字符串转换成json的三种方式
    启动数据库SQL Server Service Broker
    ASP.NET两种缓存方式
    VS安装控件后报错
    sql server中有不是全数字的字符串
  • 原文地址:https://www.cnblogs.com/jxw-29/p/7601585.html
Copyright © 2011-2022 走看看