2009-08-03 9 views
2

ich eine DB haben, die auf die folgende URL verweist:URL-Dekodierung Verwirrung

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

Allerdings scheint es, dass dies eine schlechte urlencoding ist, Probleme zu verursachen sowohl mit HttpUtility.UrlDecode (gibt mir Müll) und Uri.UnescapeDataString (UriFormatException). Mein Browser übergibt den Pfad auf Wikipedia unverändert (so gehe ich davon aus das% F6 wird vom Browser verschlüsselt), wie folgt:

GET/wiki/Herbert_Gr% F6nemeyer HTTP/1.1

Wikipedia erkennt und 301 Umleitungen an :

Ort: http://en.wikipedia.org/wiki/Herbert_Gr%C3%B6nemeyer

Was hier los? Hat Wikipedia eine zusätzliche proprietäre Verschlüsselung?

EDIT: Ich habe eine lokale Kopie von Wikipedia, die ich versuche, Verweis auf diese URL zu verweisen. Die Artikel sind nach Titeln indiziert, in diesem Fall wäre das "Herbert Grönemeyer". Kann jemand vorschlagen, wie ich in Code von "Herbert_Gr% F6nemeyer" zu "Herbert Grönemeyer" gehen würde? Offensichtlich ist der Unterstrich hier nicht das Problem.

Antwort

4

% C3% B6 ist die korrekte UTF-8 Kodierung für ö (o-umlaut). Ich würde annehmen, dass% F6 Byte-für-Byte-Kopie des Bytewerts für eine lokale Codierung desselben Zeichens ist (z. B. von der Codepage 1252).

2

Hier ist ein paar quick'n'dirty Code, den ich zusammengeschustert habe, um einen Sinn daraus zu machen. Danke an Josip dafür, dass er mich in die richtige Richtung weist:

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

Josips Antwort war großartig, um Sie so weit zu bringen, aber das ist die beste (solide) Antwort auf jemand anderen, würde ich denken. Danke an beide. – PandaWood