Powershell与C#EscapeUriString的结果不同

Yaw*_*awe 6 .net c# powershell

使用标准C#代码和命令时出现以下问题:

Uri.EscapeUriString("[]")
Run Code Online (Sandbox Code Playgroud)

我明白了:

"[]"
Run Code Online (Sandbox Code Playgroud)

但是当我使用PowerShell时:

[Uri]::EscapeUriString("[]") 
Run Code Online (Sandbox Code Playgroud)

我明白了

"%5B%5D"
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下这些方法调用的区别吗?为什么我会得到不同的结果?如何强制PowerShell返回与标准c#相同的结果?提前致谢

mar*_*sze 3

这似乎与 .NET 版本相关。您的 C# 代码可能使用更新的版本。

C#

// .NET 4.0
Uri.EscapeUriString("[]"); // OUTPUT: "%5B%5D"

// .NET 4.5
Uri.EscapeUriString("[]"); // OUTPUT: "[]"
Run Code Online (Sandbox Code Playgroud)

电源外壳

# v5
[Uri]::EscapeUriString("[]") # OUTPUT: "%5B%5D"

# for reference
Add-Type "
using System;
namespace PowerShell
{
    public static class Uri
    {
        public static string EscapeUriString(string stringToEscape)
        {
            return System.Uri.EscapeUriString(stringToEscape);
        }
    }
}"
[PowerShell.Uri]::EscapeUriString("[]") # OUTPUT: "%5B%5D"
Run Code Online (Sandbox Code Playgroud)

不存在“标准 C#”。解决方案是确保两者使用相同的 .NET 版本,或者实现您自己的转义方法。

或者,使用System.Net.WebUtility.UrlEncodewhich 似乎"%5B%5D"在这两种情况下都会返回。

更新

PowerShell Core(使用 .NET 6+)中,相同的示例[]按预期返回。