apache中文乱码_文件名称乱码怎么解决

apache中文乱码_文件名称乱码怎么解决RestSharp是一个第三方开源的Http模拟请求辅助类,其底层实现基于System.Net.HttpWebRequest,且不依赖于任何第三方控件。其github地址为:https://github.com/restsharp/RestSharp,start数可以说明该类库的知名度,当然侧面也可以证明它的确是一个比较好用的HTTP请求辅助类。一般情况下,RestSharp都工作的很好,只是当…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

RestSharp是一个第三方开源的Http模拟请求辅助类,其底层实现基于System.Net.HttpWebRequest,且不依赖于任何第三方控件。其github地址为:https://github.com/restsharp/RestSharp,start数可以说明该类库的知名度,当然侧面也可以证明它的确是一个比较好用的HTTP请求辅助类。

一般情况下,RestSharp都工作的很好,只是当服务端地址指定了非Utf-8编码方式时,RestSharp会开始出现各种乱码问题(请求内容乱码、响应内容乱码)。

对于请求部分的Encoding问题,通过RestClient.ConfigureHttp以及Http.CalculateContentLength这两个方法的源代码,发现我们可以通过设置RestClient.Encoding来解决请求部分的编码问题,通过RestClient的构造函数,我们也可以发现其初始值为Encoding.UTF8,当然别忘了设置请求相应的ContentType

var client = new RestClient(url);
client.Encoding = Encoding.GetEncoding("gb2312");
client.AddDefaultHeader("Content-Type", "text/html;charset=gb2312");

而对于IRestResponse部分,RestSharp的处理方式就不是那么友好了,通过RestResponseBase.Content以及MiscExtensions.AsString,我们可以看到其赤果果的简单粗暴,就是只认Encoding.UTF8,也就是对于IRestResponse部分,默认情况下,RestSharp根本就没考虑过Encoding问题,IRestResponse.ContentEncodingIRestResponse.ContentType在这里就是摆设!但幸好,IRestResponse.Content是可读可写的,而且我们也可以通过IRestResponse.RawBytes来得到服务器原始的响应内容,所以我们可以通过自定义一个扩展来自己完成这个编码的转换过程。

    /// <summary>
    /// <see cref="RestSharp"/>辅助类
    /// </summary>
    public static class RestSharpHelper
    { 
   
        /// <summary>
        /// 根据<see cref="IRestResponse.ContentEncoding"/>或<see cref="IRestResponse.ContentType"/>设置<see cref="IRestResponse.Content"/>
        /// </summary>
        /// <param name="response">Rest响应实体</param>
        public static void SetResponseEncoding(this IRestResponse response)
        { 
   
            var encoding = response.ContentEncoding;
            if (string.IsNullOrWhiteSpace(encoding) && !string.IsNullOrWhiteSpace(response.ContentType))
            { 
   
                var tmp = response.ContentType.Split(';').Select(s => s.Split('='));
                var arr = tmp.LastOrDefault(t => t.Length == 2 && t[0].Trim().ToLower() == "charset");
                if (arr != null)
                { 
   
                    encoding = arr[1].Trim();
                }
            }
            if (!string.IsNullOrWhiteSpace(encoding))
            { 
   
                response.SetResponseEncoding(encoding);
            }
        }
        /// <summary>
        /// 根据Encoding设置<see cref="IRestResponse.Content"/>
        /// </summary>
        /// <param name="response">Rest响应实体</param>
        /// <param name="encoding">响应内容编码方式</param>
        public static void SetResponseEncoding(this IRestResponse response, string encoding)
        { 
   
            if (!string.IsNullOrWhiteSpace(encoding))
            { 
   
                response.SetResponseEncoding(Encoding.GetEncoding(encoding));
            }
        }
        /// <summary>
        /// 根据Encoding设置<see cref="IRestResponse.Content"/>
        /// </summary>
        /// <param name="response">Rest响应实体</param>
        /// <param name="encoding">响应内容编码方式</param>
        public static void SetResponseEncoding(this IRestResponse response, Encoding encoding)
        { 
   
            if (encoding != null)
            { 
   
                response.ContentEncoding = encoding.WebName;
                response.Content = encoding.GetString(response.RawBytes);
            }
        }
    }

接下来就是在执行请求后简单的调用一次

var request = new RestRequest(Method.POST);
//设置反序列化时预先处理乱码问题,如果调用的是Execute<T>方法,那么后面无需再次调用该方法
request.OnBeforeDeserialization = res => RestSharpHelper.SetResponseEncoding(res, "gb2312");
var response = client.Execute(request);
//直接读取Content还是需要调用该方法
RestSharpHelper.SetResponseEncoding(response, "gb2312");

注意在这里我们对IRestRequest.OnBeforeDeserialization进行了赋值,该委托主要用于反序列化时解决Encoding导致的乱码问题,所以说其实RestSharp是知道有这个问题,但没有对该问题进行处理……

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/196099.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java与python-如何对比Python和Java,只需三分钟告诉你!

    java与python-如何对比Python和Java,只需三分钟告诉你!原标题:如何对比Python和Java,只需三分钟告诉你!Java和Python两门语言都是目前非常热门的语言,可谓北乔峰南慕容,二者不分上下,棋逢对手。但是对于初学者来说,非常困惑,因为时间和精力有限,上手必须要先学一门,到底选那个好呢,今天3分钟带你透彻了解。1.运行速度java是静态语言静态编译的,速度上要比Python快的很多,而Python动态类型语言,一边执行一边编译,速度要上慢一些…

    2022年7月7日
    27
  • 深度学习环境搭建(GPU)CUDA安装(完全版)

    深度学习环境搭建(GPU)CUDA安装(完全版)深度学习环境搭建(GPU)CUDA安装cuDNN安装

    2022年5月23日
    140
  • java培训学校杭州_杭州Java培训班

    java培训学校杭州_杭州Java培训班前言这段时间也一直在学习Netty相关知识,因为涉及知识点比较多,也走了不少弯路。目前网上关于Netty学习资料玲琅满目,不知如何下手,其实大家都是一样的,学习方法和技巧都是总结出来的,我们在没有找到很好的方法之前不如按部就班先从基础开始,一般从总分总的渐进方式,既观森林,又见草木。Netty是一款提供异步的、事件驱动的网络应用程序框架和工具,是基于NIO客户端、服务器端的编程框架。所以这里我们先以NIO和依赖相关的基础铺垫来进行剖析讲解,从而作为Netty学习之旅的一个开端。为什么学Java?Jav

    2022年10月3日
    0
  • Web安全-一句话木马

    Web安全-一句话木马概述在很多的渗透过程中,渗透人员会上传一句话木马(简称Webshell)到目前web服务目录继而提权获取系统权限,不论asp、php、jsp、aspx都是如此,那么一句话木马到底是什么呢?先来看看最简单的一句话木马:&amp;amp;amp;amp;amp;amp;amp;lt;?php@eval($_POST[‘attack’])?&amp;amp;amp;amp;amp;amp;amp;gt;【基本原理】利用文件上传漏洞,往目标网站中上传一句话木马,然后你就

    2022年5月11日
    34
  • PHPMailer发送邮件中文附件名是乱码

    PHPMailer发送邮件中文附件名是乱码

    2021年9月22日
    43
  • 切比雪夫不等式为_闵可夫斯基不等式和柯西不等式

    切比雪夫不等式为_闵可夫斯基不等式和柯西不等式一、马尔可夫不等式马尔可夫不等式描述的是非负随机变量绝对位置的概率上限对于非负随机变量X,a>=0,有证明:原式可化为注意到,因为X非负,右边二、切比雪夫不等式切比雪夫不等式描述的是随机变量距期望相对位置偏离的概率上限证明:记右边注意到,在中,,因此有三、柯西-施瓦茨不等式…

    2022年10月25日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号