IRI を解析するときに、.net の Uri クラスに苦労しています。
次の IRI を検討してください。
var iriStr = "http://example.com/base/植物/名=しそ;使用部=葉";
これから Uri を作成すると (iri 解析設定に関係なく)、次のようになります。
var uri = new Uri(iriStr);
Assert.AreEqual(iriStr, uri.ToString()); // this works
Assert.AreEqual(iriStr, uri.AbsoluteUri); // this fails
uri.AbsolutUri が返す実際の値は次のとおりです。
http://example.com/base/%E6%A4%8D%E7%89%A9%2F%E5%90%8D%3D%E3%81%97%E3%81%9D%3B%E4%BD%BF%E7%94%A8%E9%83%A8%3D%E8%91%89
Uri クラスは、RFC3987 仕様ではなく RFC3986 で説明されているように機能するようです (ただし、msdnは別のことを言っています)。後者に従ってエスケープされた正しい文字列表現を返すには、Uri#AbsoluteUri が必要です。
どうしてこうなの?この動作を変更する方法はありますか?