Как закодировать путь, содержащий хэш?
Как вы правильно кодируете путь, который включает в себя хэш (#)? Обратите внимание, что хэш не является индикатором фрагмента (закладки?), А частью имени пути.
Например, если существует такой путь:
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();
}
}