zoukankan      html  css  js  c++  java
  • 使用RestSharp请求GBK编码的网站乱码(NetCore环境)

    开发环境:Net core ,

    Nuget包: RestSharp

    问题:获取的网站编码格式是GBK,所以返回的数据乱码(RestSharp虽然开源并且很方便,但关于请求编码处理的有点坑)

    解决方法:RestClient不仅会返回body界面同时会返回一个byte[]类型的数组,这个数组是GBK编码形成的,通过HttpUtility.UrlDecode(response.RawBytes, Encoding.GetEncoding("gbk"))把数组转换成正常的GBK的值就可以了(Netcore 无法识别GBK编码格式,方法在下面)

    网站是Get请求 代码如下:

          /// <summary>
            /// Get 获取数据
            /// </summary>
            /// <param name="Url">网址</param>
            /// <returns></returns>
            public static object GetHelperAsync(string Url)
            {
                var client = new RestClient(Url);
                var request = new RestRequest(Method.GET);
                //我请求的网站请求头需要一些参数
                request.AddHeader("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3");
                IRestResponse response = client.Execute(request);
                return response.Content;     
            }

    接收到的网页乱码,然后通过查看网页源代码发现编码方式为(charset=GBK)

    因为大部分网页乱码都是由于请求标头和所访问的界面格式不一致引起的。

    1.引入支持GBK编码的包 System.Text.Encoding.CodePages

    Netcore不识别GBK编码格式,所以Encoding.GetEncoding("GBK")会报错,引入上述的nuget包,然后在使用Encoding方法之前 注册该包内的编码

    Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

    这样就不会报错了。最后代码:

       /// <summary>
            /// Get 获取数据
            /// </summary>
            /// <param name="Url">网址</param>
            /// <returns></returns>
            public static object GetHelperAsync(string Url)
            {
                var client = new RestClient(Url);
                var request = new RestRequest(Method.GET);
                //我请求的网站请求头需要一些参数
                request.AddHeader("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3");
                IRestResponse response = client.Execute(request);
                Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
                var data=HttpUtility.UrlDecode(response.RawBytes, Encoding.GetEncoding("gbk"));
                return data;                    
            }

    RestSharp会把原来网站以byte[]数组的形式存放在RawBytes中,我们对这个数组解码就可以获取到正常的数据了

  • 相关阅读:
    SQL 语法解释器jsqlparser
    《JAVA与模式》之解释器模式
    程序猿应该了解的内容以及程序猿如何强迫自己学习(思考篇)
    强迫自己学习(心态篇),国庆,你准备去哪疯?
    强迫自己学习(实践篇),以及关于写博客的几点建议
    JAVA GC垃圾收集器的分析
    JVM内存模型及内存分配过程
    Extended Traffic LightOJ
    HDU 4616 Game 树形DP
    POJ 3164 Command Network
  • 原文地址:https://www.cnblogs.com/niubi007/p/11424748.html
Copyright © 2011-2022 走看看