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%8F了RLM字符部分:
...!%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 字符的文件,无论WebClient是HttpWebRequest.
有什么办法可以解决这个怪癖吗?
在 .Net 4.5 中默认启用国际资源标识符支持。当以 .Net 4.7.2 为目标时,从右到左的标记似乎再次受到尊重,这可能表明存在错误。
如果项目需要面向.NET 4.5,该方法ToggleIDNIRISupport在这篇文章可以帮助解决这个问题。
像这样调用方法:
ToggleIDNIRISupport(false);
Run Code Online (Sandbox Code Playgroud)
在此方法调用后构造 URI 时,它包含从右到左的标记。