隐藏

C#有关URL中特殊字符的处理方法

发布:2022/12/2 9:34:34作者:管理员 来源:本站 浏览次数:996

一、问题 URL 传递时 客户端发送的和服务端接收到的不一致


经分析是因为URL 中含有特殊字符"#$ ^ & * + =",这些字符在URL 中被转义啦!!!


常见的URL 中的特殊字符、表示的意义以及十六进制的表示


字符       意义                                                   十六进制

+          URL 中+号表示空格                                  %2B

空格       URL中的空格可以用+号或者编码                %20

/         URL 中分隔目录和子目录                             %2F

?          URL 中分隔实际的 URL 和参数                    %3F

%          URL 中指定特殊字符                                %25

#          URL 中表示书签                                       %23

&          URL 中指定的参数间的分隔符                     %26

=          URL 中指定参数的值                                 %3D


 

二、常见解决方法


在 c#中有三种常用的编码方式,可以有效的解决URL传输中特殊字符的问题


1  HttpUtility.UrlEncode      


2  Server.UrlEncode


3  Uri.EscapeUriString



我们以第一个方法为例:


//需要现在工程中引用System·web

var tmpURL = @"C:\Users\hu\Desktop\数据\tiemtest\000000#$^&*+=";

   var originalUrl = System.Web.HttpUtility.UrlEncode(tmpURL );

   var serverUrl = System.Web.HttpUtility.UrlDecode(originalUrl);

   //这一步我们发现serverUrl 和tmpURL 是一致的,这样就达到了我们想要的效果


 


今天介绍另外一种,在URL 中传递文件路径时发现上述问题,于是采用了上述三种方法之外的方法:

三、所用方法


客户端传递URL:


//先转成UTF8编码

var filePathByte = Encoding.UTF8.GetBytes(filePath);

//再转为Base64

subFilePath = Convert.ToBase64String(filePathByte);

   RestProxy.RestPostAsync<bool, Stream>(GetFileMethodUrl("Method", subFilePath), fileContent, callBack, config);


 


服务端接收处理:

服务端转换过程和客户端的转换过程相反,服务对接收到的URL要先进行URL base 64 转换 再进行UTF8 转换


//base64 转换

subFilePath = Convert.FromBase64String(subFilePath));

//UTF8 转换

subFilePath = subFilePath = Encoding.UTF8.GetString(subFilePath );

//针对"\\"进行特殊处理

while (subFilePath.StartsWith("\\"))

   {

       subFilePath = subFilePath.Remove(0, 1);

   }


 

上述方法可以解决文件路径当URL的一部分来传递时遇到异常的情况