Как закодировать путь, содержащий хэш?

Как вы правильно кодируете путь, который включает в себя хэш (#)? Обратите внимание, что хэш не является индикатором фрагмента (закладки?), А частью имени пути.

Например, если существует такой путь:

http://www.contoso.com/code/c#/somecode.cs

Это вызывает проблемы, когда вы, например, пытаетесь сделать это:

Uri myUri = new Uri("http://www.contoso.com/code/c#/somecode.cs");

Казалось бы, он интерпретирует хэш как индикатор фрагмента.

Неправильно вручную заменить # на% 23. Есть ли другие символы, которые нужно заменить? В Uri и HttpUtility есть некоторые методы экранирования, но ни один из них не выполняет трюк.

Ответы

Ответ 1

Сделал ли еще несколько друзей по поиску и нашел дубликат для Java: Кодирование URL-адреса HTTP в Java

Однако класс .Net Uri не предлагает необходимый нам конструктор, но UriBuilder делает.

Итак, чтобы построить правильный URI, где путь содержит недопустимые символы, сделайте следующее:

// Build Uri by explicitly specifying the constituent parts. This way, the hash is not confused with fragment identifier
UriBuilder uriBuilder = new UriBuilder("http", "www.contoso.com", 80, "/code/c#/somecode.cs");

Debug.WriteLine(uriBuilder.Uri);
// This outputs: http://www.contoso.com/code/c%23/somecode.cs

Обратите внимание, что он не излишне избегает частей URI, которые не требуют экранирования (например://part), что имеет место с HttpUtility.UrlEncode. Казалось бы, цель этого класса состоит в том, чтобы на самом деле кодировать часть запроса/фрагмента URL-адреса, а не схему или имя хоста.

Ответ 2

Есть несколько символов, которые вы не должны использовать. Вы можете попробовать проложить свой путь через эту очень сухую документацию или обратиться к этому удобному сводке URL-адресов при переполнении стека.

Если вы посмотрите этот веб-сайт, вы увидите, что их вопросы на С# закодированы %23.

Вопросы С#

Вы можете сделать это, используя либо (для ASP.NET):

string.Format("http://www.contoso.com/code/{0}/somecode.cs", 
    Server.UrlEncode("c#")
);

Или для библиотек классов/рабочего стола:

string.Format("http://www.contoso.com/code/{0}/somecode.cs",
    HttpUtility.UrlEncode("c#")
);

Ответ 3

Используйте UrlEncode: System.Web.HttpUtility.UrlEncode(string)

class Program
{
    static void Main(string[] args)
    {
        string url = "http://www.contoso.com/code/c#/somecode.cs";
        string enc = HttpUtility.UrlEncode(url);

        Console.WriteLine("Original: {0} ... Encoded {1}", url, enc);
        Console.ReadLine();
    }
}