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时,包含从右到左的标记。
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时,包含从右到左的标记。