Uri 忽略特殊字符

Posted

技术标签:

【中文标题】Uri 忽略特殊字符【英文标题】:Uri ignore special characters 【发布时间】:2013-12-11 06:23:57 【问题描述】:

我得到一个代表 url 的字符串,我想通过 c# 下载内容

我的网址包含 right to left mark 和 left to right mark %E2%80%8F & %E2%80%8E。

当我将 url 粘贴到浏览器中时,我可以显示该文件。 当我在 .net 中使用代码时出现错误(因为 .net 会忽略这些标记并且不会在请求中发送它们。

这是我得到的查询字符串

/MBA%20%281%29/%D7%90%D7%A1%D7%98%D7%A8%D7%98%D7%92%D7%99%D7%94%20%D7%A2 %D7%A1%D7%A7%D7%99%D7%AA%20%D7%AA%D7%97%D7%A8%D7%95%D7%AA%D7%99%D7%AA%20%28 %E2%80%8F%EF%BB%BF13015%E2%80%8E%29%E2%80%8F/%D7%93%D7%A4%D7%99%20%D7%A0%D7%95% D7%A1%D7%97%D7%90%D7%95%D7%AA%20%D7%9C%D7%9E%D7%91%D7%97%D7%9F/%D7%90%D7%A1 %D7%98%D7%A8%D7%98%D7%92%D7%99%D7%94%20%D7%93%D7%A3%20%D7%A0%D7%95%D7%A1%D7 %97%D7%90%D7%95%D7%AA-2%20%D7%A2%D7%9E-%203%20%D7%A2%D7%9E%D7%95%D7%93%D7% 95%D7%AA%20%D7%9C%D7%A8%D7%95%D7%97%D7%91.pdf

使用小提琴我可以发送.net

/MBA%20(1)/%D7%90%D7%A1%D7%98%D7%A8%D7%98%D7%92%D7%99%D7%94%20%D7%A2% D7%A1%D7%A7%D7%99%D7%AA%20%D7%AA%D7%97%D7%A8%D7%95%D7%AA%D7%99%D7%AA%20(%EF %BB%BF13015)/%D7%93%D7%A4%D7%99%20%D7%A0%D7%95%D7%A1%D7%97%D7%90%D7%95%D7%AA%20 %D7%9C%D7%9E%D7%91%D7%97%D7%9F/%D7%90%D7%A1%D7%98%D7%A8%D7%98%D7%92%D7%99% D7%94%20%D7%93%D7%A3%20%D7%A0%D7%95%D7%A1%D7%97%D7%90%D7%95%D7%AA-2%20%D7% A2%D7%9E-%203%20%D7%A2%D7%9E%D7%95%D7%93%D7%95%D7%AA%20%D7%9C%D7%A8%D7%95%D7 %97%D7%91.pdf

你会发现标记不见了。

知道怎么解决吗?

这里有一些代码: var s = "https://dl.dropboxusercontent.com/1/view/4fsaouo0ob52xkz/MBA%20%281%29/%D7%90%D7%A1%D7%98%D7%A8%D7%98%D7%92%D7%99%D7%94%20%D7%A2%D7%A1%D7%A7%D7%99%D7%AA%20%D7%AA%D7%97%D7%A8%D7%95%D7%AA%D7%99%D7%AA%20%28%E2%80%8F%EF%BB%BF13015%E2%80%8E%29%E2%80%8F/%D7%93%D7%A4%D7%99%20%D7%A0%D7%95%D7%A1%D7%97%D7%90%D7%95%D7%AA%20%D7%9C%D7%9E%D7%91%D7%97%D7%9F/%D7%90%D7%A1%D7%98%D7%A8%D7%98%D7%92%D7%99%D7%94%20%D7%93%D7%A3%20%D7%A0%D7%95%D7%A1%D7%97%D7%90%D7%95%D7%AA-2%20%D7%A2%D7%9E-%203%20%D7%A2%D7%9E%D7%95%D7%93%D7%95%D7%AA%20%D7%9C%D7%A8%D7%95%D7%97%D7%91.pdf";

        using (HttpClient client = new HttpClient())
        

            using (var sr = client.GetAsync(s).Result)
            
                Console.WriteLine(sr.Headers);
            

        

我尝试手动创建 uri 并将其传递给 httpClient - 保存结果。 sr - 得到 403 错误代码而不是 200(我提供的链接无效但最终结果相同)。

【问题讨论】:

好的,这个问题只发生在 .net 4.5 和 .net 4.5.1 上。在 .net 4 和 3.5 上不会出现此问题 System.Uri 在 .net 4.5 中已更改。不幸的是,它在 HttpClient、WebClient 和 HttpWebrequest 中使用。 @LostInComputer - 我读到 .net 4.5 更改了 Uri。有什么办法可以通过吗?在不使用 Uri 的情况下进行 http 调用? @Ram 不知道任何内部不使用 Uri 的内置 .net 类 我收到未授权状态码 【参考方案1】:

试试这个:

 var uri = "https://dl.dropboxusercontent.com/1/view/4fsaouo0ob52xkz/MBA%20%281%29/%D7%90%D7%A1%D7%98%D7%A8%D7%98%D7%92%D7%99%D7%94%20%D7%A2%D7%A1%D7%A7%D7%99%D7%AA%20%D7%AA%D7%97%D7%A8%D7%95%D7%AA%D7%99%D7%AA%20%28%E2%80%8F%EF%BB%BF13015%E2%80%8E%29%E2%80%8F/%D7%93%D7%A4%D7%99%20%D7%A0%D7%95%D7%A1%D7%97%D7%90%D7%95%D7%AA%20%D7%9C%D7%9E%D7%91%D7%97%D7%9F/%D7%90%D7%A1%D7%98%D7%A8%D7%98%D7%92%D7%99%D7%94%20%D7%93%D7%A3%20%D7%A0%D7%95%D7%A1%D7%97%D7%90%D7%95%D7%AA-2%20%D7%A2%D7%9E-%203%20%D7%A2%D7%9E%D7%95%D7%93%D7%95%D7%AA%20%D7%9C%D7%A8%D7%95%D7%97%D7%91.pdf";


       string Url= System.Web.HttpUtility.UrlDecode(uri);
        //objDataToXml.GenerateXml();
       using (HttpClient client = new HttpClient())
       

           using (var sr = client.GetAsync(Url).Result)
           
               Console.WriteLine(sr.Headers);
           

       

【讨论】:

以上是关于Uri 忽略特殊字符的主要内容,如果未能解决你的问题,请参考以下文章

URI 中特殊字符处理

URL传参中不能带特殊的字符以及处理方案

忽略特殊 Unicode 字符的字符串比较

如何忽略Lua中字符串操作的特殊字符?

在忽略特殊字符的同时匹配和替换子字符串

如何通过忽略字符串前面的特殊字符从文本中提取正确的字符串?