У меня есть 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" в коде. Очевидно, подчеркивание здесь не проблема.
% C3% B6 - это правильная кодировка UTF-8 для ö (o-umlaut). Я бы предположил, что% F6 является байтовой байтовой величиной байта для некоторой локальной кодировки одного и того же символа (например, с кодовой страницы 1252).
Вот какой-то быстрый 'грязный код, который я собрал вместе, чтобы понять это. Спасибо Джосипу за то, что он указал мне в правильном направлении:
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;
}