Как кодировать путь, который содержит хэш? - PullRequest
17 голосов
/ 17 февраля 2012

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

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

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

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

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

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

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

Ответы [ 3 ]

6 голосов
/ 17 февраля 2012

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

Если вы загляните на этот сайт, вы увидите, что их вопросы на C # закодированы %23.

Вопросы о переполнении стека C #

Вы можете сделать это, используя (для 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#")
);
4 голосов
/ 17 февраля 2012

Еще раз покопался в друзьях и нашел дубликат вопроса для Java: Кодировка 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, которые не нуждаются в экранировании (например, часть: //), как в случае с HttpUtility.UrlEncode.Казалось бы, цель этого класса - на самом деле кодировать часть URL-адреса строки запроса / фрагмента, а не схему или имя хоста.

2 голосов
/ 17 февраля 2012

Использование 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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...