Поиск API синтаксического анализа для частично URL-адресов в кодировке utf8 - PullRequest
8 голосов
/ 11 декабря 2008

При синтаксическом анализе HTML для определенных веб-страниц (в частности, для любой живой страницы Windows) я сталкиваюсь с множеством URL-адресов в следующем формате.

HTTP \ X3A \ x2f \ x2fjs.wlxrs.com \ x2fjt6xQREgnzkhGufPqwcJjg \ x2fempty.htm

Похоже, что это частично экранированные строки UTF8 (\ x2f = /, \ x3a =: и т. Д.). Существует ли .Net API, который можно использовать для преобразования этих строк в System.Uri? Кажется, это легко разобрать, но я стараюсь не строить новое колесо сегодня.

Ответы [ 3 ]

3 голосов
/ 14 сентября 2009

То, что вы опубликовали, не является действительным HTTP. Таким образом, конечно, HttpUtility.UrlDecode() не будет работать. Но независимо от этого, вы можете превратить это обратно в обычный текст, например так:

string input = @"http\x3a\x2f\x2fjs.wlxrs.com\x2fjt6xQREgnzkhGufPqwcJjg\x2fempty.htm";
string output = Regex.Replace(input, @"\\x([0-9a-f][0-9a-f])",
    m => ((char) int.Parse(m.Groups[1].Value, NumberStyles.HexNumber)).ToString());

Но обратите внимание, что это предполагает, что кодировка - Latin-1, а не UTF-8. Введенные вами данные неубедительны в этом отношении. Если вам нужен UTF-8 для работы, вам нужен немного более длинный маршрут; вам придется преобразовать строку в байты и заменить escape-последовательности соответствующими байтами в процессе (вероятно, требуется цикл while), а затем использовать Encoding.UTF8.GetString() в результирующем байтовом массиве.

0 голосов
/ 12 января 2013

вот другое решение: (как продолжение решения @timwi)

string output = Regex.Replace(input, @"\\x([0-9a-f][0-9a-f])",
            m => ((char)Convert.ToInt32(m.Groups[1].Value, 16)).ToString());
0 голосов
/ 11 декабря 2008

Вы пробовали HttpUtility.UrlDecode ?

...