System.Uri 在 .NET 4.5+ 中删除 Unicode RLM(从右到左标记;U+200F)字符

Ant*_*lev 6 c# unicode uri

using System;

namespace UnicodeRlm
{
    class Program
    {
        static void Main(string[] args)
        {
            var uri = new Uri(
                "https://example.com/attachments/The title is \"????? ?????? ?????!?\" in Arabic.pdf");
            Console.WriteLine(uri.AbsolutePath);
            Console.WriteLine(uri.AbsolutePath.Length);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在 .NET 4.0 下,这会产生

/attachments/The%20title%20is%20%22%D9%85%D9%81%D8%AA%D8%A7%D8%AD%20%D9%85%D8%B9%D8%A7%D9%8A%D9%8A%D8%B1%20%D8%A7%D9%84%D9%88%D9%8A%D8%A8!%E2%80%8F%22%20in%20Arabic.pdf
168
Run Code Online (Sandbox Code Playgroud)

在 .NET 4.5+ 下,这会产生

/attachments/The%20title%20is%20%22%D9%85%D9%81%D8%AA%D8%A7%D8%AD%20%D9%85%D8%B9%D8%A7%D9%8A%D9%8A%D8%B1%20%D8%A7%D9%84%D9%88%D9%8A%D8%A8!%22%20in%20Arabic.pdf
159
Run Code Online (Sandbox Code Playgroud)

.NET 4.5 删除%E2%80%8FRLM字符部分:

...!%E2%80%8F%22%20in%20Arabic.pdf
...!%22%20in%20Arabic.pdf
Run Code Online (Sandbox Code Playgroud)

我有一个假设,这是由System.Uri 转义引起的,现在支持 RFC 3986,但是我的 RFC-fu 和 Unicode-fu 使我无法确定此 RFC 是否需要删除 RLM 或完全正确放置此 RLM 字符在原始字符串中。

我不完全确定这是否是正确的行为标准,但对我来说肯定不是,因为我无法在 .NET 4.5 中下载名称中带有 RLM 字符的文件,无论WebClientHttpWebRequest.

有什么办法可以解决这个怪癖吗?

ale*_*-dl 7

在 .Net 4.5 中默认启用国际资源标识符支持。当以 .Net 4.7.2 为目标时,从右到左的标记似乎再次受到尊重,这可能表明存在错误。

如果项目需要面向.NET 4.5,该方法ToggleIDNIRISupport这篇文章可以帮助解决这个问题。

像这样调用方法:

ToggleIDNIRISupport(false);
Run Code Online (Sandbox Code Playgroud)

在此方法调用后构造 URI 时,它包含从右到左的标记。