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

System.Uri drops Unicode RLM (Right-to-Left Mark; U+200F) character in .NET 4.5+

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);
        }
    }
}

在 .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

在 .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

.NET 4.5 删除了 %E2%80%8F 部分,即 RLM 字符:

...!%E2%80%8F%22%20in%20Arabic.pdf
...!%22%20in%20Arabic.pdf

我假设这是由 System.Uri escaping now supports RFC 3986 引起的,但是我的 RFC-fu 和 Unicode-fu 让我无法确定此 RFC 是否需要删除 RLM 或是否正确放置此 RLM 字符完全在原始字符串中。

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

有什么办法可以解决这个问题吗?

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

如果项目需要针对.Net 4.5,this post中的方法ToggleIDNIRISupport可以帮助解决这个问题。

调用方法如下:

ToggleIDNIRISupport(false);

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