如何正确使用网址编码和解码

本文关键字:编码 解码 何正确 | 更新日期: 2023-09-27 18:36:29

所以我有一个文件要上传到 azure blob 存储:

C:''test folder''A+B''testfile.txt

以及两个扩展方法,可帮助对我的路径进行编码,以确保为其提供有效的 Azure 存储 blob 名称

    public static string AsUriPath(this string filePath)
    {
        return System.Web.HttpUtility.UrlPathEncode(filePath.Replace('''', '/'));
    }
    public static string AsFilePath(this string uriPath)
    {
        return System.Web.HttpUtility.UrlDecode(uriPath.Replace('/', ''''));
    }

因此,在上传文件时,我AsUriPath对其进行编码并获取名称test%20folder'A+B'testfile.txt但是当我尝试将其作为文件路径恢复时,我得到test folder'A B'testfile.txt显然不一样(+已被删除)

使用UrlEncode和UrlDecode的正确方法是什么,以确保您将获得与最初编码相同的信息解码?

如何正确使用网址编码和解码

如果您使用 WebUtility.UrlEncode 而不是 HttpUtility.UrlPathEncode,它就可以工作

如果你查看HttpUtility.UrlPathEncode上的文档,你会看到它指出:

请勿使用;仅用于浏览器兼容性。使用 UrlEncode。

我已经编写了一个简单的示例,可以粘贴到控制台应用程序中(您需要引用 System.Web 程序集)

static void Main(string[] args)
{
    string filePath = @"C:'test folder'A+B'testfile.txt";
    var encoded = WebUtility.UrlEncode(filePath.Replace('''', '/'));
    var decoded = WebUtility.UrlDecode(encoded.Replace('/', ''''));
    Console.WriteLine(decoded);
}

在此.NET小提琴上运行它

使用 System.Uri

类正确编码路径:MSDN System.Uri

在路径上尝试以下操作,并使用调试器进行检查:

        var myUri = new System.Uri("http://someurl.com/my special path + is this/page?param=2");
        var thePathAndQuery = myUri.PathAndQuery;
        var theAbsolutePath = myUri.AbsolutePath;
        var theAbsoluteUri = myUri.AbsoluteUri;