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

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


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.ContentEncoding和IRestResponse.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中jbpm工作流_安卓框架

    java中jbpm工作流_安卓框架JBPM工作流框架应用导入jar包jbpm案例中获取配置文件,并配置本地数据库创建流程,并进行相关修改流程及流程内任务等的草操作importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;importj

    2022年9月8日
  • Linux内核简介

    Linux内核简介大纲:理解Linux内核最好预备的知识点Linux内核的特点Linux内核的任务内核的组成部分哪些地方用到了内核机制?Linux进程 Linux创建新进程的机制Linux线程 内核线程地址空间与特权级别    虚拟地址与物理地址  特权级别(Linux的两种状态)    系统调用设备驱动程序、块设备和字符设备网络文件系统模块和热插拔注:本文为《深入Linux内核架构》的学习笔记理解Linux…

    2022年7月23日
  • 170406回顾-SQL Server的smalldatetime类型比较[通俗易懂]

    170406回顾-SQL Server的smalldatetime类型比较[通俗易懂]在比较SQLServer的类型为smalldatetime字段时出现下面的错误:将expression转换为数据类型smalldatetime时出现算术溢出错误正确的比较方法如下:将long型转换为时间格式的字符串,再与smalldatetime类型的字段比较SELECT*FROMtablenameWHEREEditFlag>’2017/3…

    2022年5月18日
  • kinect深度距离误差_TOF相机深度矫正基于Kinect v2

    kinect深度距离误差_TOF相机深度矫正基于Kinect v2之前的文章《answer:深度相机(TOF)矫正》由于时间匆忙,临时想了一种深度相机深度像素矫正方法,即固定高度逐像素矫正。该方法简单粗暴,效果并不理想,最近查阅了相关文献资料,基于之前的思路整理出一种现场可用的简单易行的矫正方法。二维平面畸变矫正使用张氏标定法对二维平面进行径向畸变矫正。深度像素矫正做图像处理的难点在于图像包括图像的噪声随机性很大,即使在同一位置拍摄也没有完全一样的图像,所以所设…

    2022年5月25日
  • jar运行发生ClassNotFound的完整解决方案

    jar运行发生ClassNotFound的完整解决方案原文地址:http://www.java2000.net/viewthread.jsp?tid=6053转载请注明上述链接或者CSDN的链接1今天彻底测试了jar程序TestJar.javapackagenet.java2000.test.jar;importjavax.swing.JOptionPane;importorg.springframework.beans.fa

    2022年7月16日
  • python测试系列教程——python+Selenium+chrome自动化测试框架

    python测试系列教程——python+Selenium+chrome自动化测试框架全栈工程师开发手册(作者:栾鹏)python教程全解需要的环境浏览器(Firefox/Chrome/IE..)PythonSeleniumSeleniumIDE(如果用Firefox)FireBug、FirePath(如果用Firefox)chromedriver、IEDriverServer、phantomjs.exeIDE(Pycharm/Subl…

    2022年4月29日

发表回复

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

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