Путаница при декодировании URL

2

У меня есть DB, который ссылается на следующий URL:

http://en.wikipedia.org/wiki/Herbert_Gr%F6nemeyer

Однако, похоже, что это плохое URLEncoding, вызывающее проблемы с HttpUtility.UrlDecode(дает мне мусор) и Uri.UnescapeDataString(UriFormatException). Мой браузер пропускает путь в Википедию без изменений (поэтому я предполагаю, что% F6 получает кодировку браузером):

GET/wiki/Herbert_Gr% F6nemeyer HTTP/1.1

Википедия распознает и 301 перенаправляет:

Местоположение: http://en.wikipedia.org/wiki/Herbert_Gr%C3%B6nemeyer

Что здесь происходит? Есть ли у Википедии дополнительное проприетарное кодирование?

EDIT: У меня есть локальная копия Википедии, которую я пытаюсь перекрестно ссылать на этот URL. Статьи индексируются по названию, что в данном случае будет: "Герберт Грёнемайер". Может ли кто-нибудь предложить, как я буду идти от "Herbert_Gr% F6nemeyer" до "Herbert Grönemeyer" в коде. Очевидно, подчеркивание здесь не проблема.

Теги:

2 ответа

4
Лучший ответ

% C3% B6 - это правильная кодировка UTF-8 для ö (o-umlaut). Я бы предположил, что% F6 является байтовой байтовой величиной байта для некоторой локальной кодировки одного и того же символа (например, с кодовой страницы 1252).

2

Вот какой-то быстрый 'грязный код, который я собрал вместе, чтобы понять это. Спасибо Джосипу за то, что он указал мне в правильном направлении:

    private string UrlDecode(string input)
    {
        string unescaped = null;
        try
        {
            unescaped = Uri.UnescapeDataString(input);
        }
        catch
        {
            unescaped = input;
            for (; ; )
            {
                var match = Regex.Match(unescaped, @"\%[A-F0-9]{2}");
                if (!match.Success)
                    break;
                byte b;
                try
                {
                    b = byte.Parse(match.Value.Substring(1), NumberStyles.HexNumber);
                }
                catch
                {
                    return HttpUtility.UrlDecode(input);
                }
                var replacement = Encoding.GetEncoding(1252).GetString(new[] { b });
                unescaped = unescaped.Substring(0, match.Index) + replacement + unescaped.Substring(match.Index + match.Length);
            }
        }
        return unescaped;
    }
  • 0
    Ответ Джосипа был велик, чтобы вы смогли зайти так далеко, однако, я думаю, это лучший (надежный) ответ кому-либо еще. Спасибо обоим.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню