• 关于asp.net HttpUtility.UrlDecode解码问题


    最近做一个支付接口,对方回调时用的gb2312编码
    asp.net默认request获取参数时是utf-8编码
    这样我在取值的时候在page_load 事件或者preint事件里设置Request.ContentEncoding = Encoding.GetEncoding("gb2312")均无效
    测试案例:建立一个asp.net web应用程序,拖一个button,一个textbox控件
    Page_Load事件代码:
    protected void Page_Load(object sender, EventArgs e)
    {
         Response.ContentEncoding = Encoding.GetEncoding("gb2312");
         //Request.ContentEncoding = Encoding.GetEncoding("gb2312");//设置是无效的
    }

    这样每次响应我们都是用的gb2312,按照asp.net默认requset对象初始化时编码为utf-8,我们在文本框输入中文,再点button按钮时,request编码为utf-8,response编码为gb2312,所以造成文本框数据回发的时候变成了乱码(文本框中文部分显示一串问号)

     
    网上千篇一律给出的办法是修改配置文件 <globalization   requestEncoding= "gb2312 "   />,这个是全局的,不推荐。我们需要的是修改某个页面的请求响应编码,而不影响到其他页面
     
    现给出解决办法一:重写InitializeCulture方法即可,加入Request.ContentEncoding 的设置
    protected override void InitializeCulture()
    {
           base.InitializeCulture();
           Request.ContentEncoding = Encoding.GetEncoding("gb2312");
    }


    解决办法二:获取表单数据字符串,自己解析

    Encoding encoding = Encoding.GetEncoding("gb2312");//自选解码方式
    Stream resStream = Request.InputStream;//接收的表单都是放这里的
    byte[] content = new byte[resStream.Length];
    resStream.Read(content, 0, content.Length);
    string postQuery = encoding.GetString(content);
    //NameValueCollection resDic = HttpUtility.ParseQueryString(postQuery, encoding);//解决编码方式问题,默认还是会自动解码

    下面给出简单的解析方法:

        /// <summary>
        /// 解析查询字符串
        /// </summary>
        /// <param name="postQuery"></param>
        /// <returns></returns>
        private NameValueCollection GetFormParams(string postQuery)
        {
            NameValueCollection result = new NameValueCollection();
            string[] nameValueList = postQuery.Split('&');
            foreach (string item in nameValueList)
            {
                if (item.Contains('='))
                {
                    string[] nameValue = item.Split('=');
                    result.Add(nameValue[0], nameValue[1]);
                }
            }
            return result;
        }
  • 相关阅读:
    剑指offer之第一个只出现一次的字符
    剑指offer之求1+2+...n
    剑指offer求两个整数之和(要求在函数体内不得使用+、-、*、/四则运算符号)
    剑指offer之从上往下打印二叉树
    剑指offer之栈的压入、弹出序列(利用辅助栈)
    58笔试-忘记题目
    联通软研院2020年球季校招笔试第三题 20190916
    简单的计算小技巧
    前端访问不到本地图片,IDEA设置Tomcat虚拟路径
    求最大子列和问题
  • 原文地址:https://www.cnblogs.com/moxianmanong/p/2729532.html
Copyright © 2020-2023  润新知