2009-08-03 92 views
2

我有一个是指以下网址DB:URL解码混乱

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

但是,似乎这是一个坏的URL编码,造成的问题既HttpUtility.UrlDecode(给我的垃圾)和Uri.UnescapeDataString(UriFormatException)。我的浏览器传递到维基百科的路径没有改变(所以我假定%F6被浏览器编码),具体如下:

GET /维基/ Herbert_Gr%F6nemeyer HTTP/1.1

维基百科承认和301重定向到:

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

这是怎么回事?维基百科是否有其他专有编码?

编辑:我有一个维基百科的本地副本,我试图交叉引用aganst此网址。这些文章按标题索引,在这种情况下将是:“HerbertGrönemeyer”。任何人都可以建议我如何从代码中的“Herbert_Gr%F6nemeyer”到“HerbertGrönemeyer”。显然,下划线在这里不是问题。

回答

4

%C3%B6是ö(o-umlaut)的正确UTF-8编码。我假设%F6是一些本地编码相同字符(例如从代码页1252)的字节值的字节对字节拷贝。

2

下面是一些quick'n'dirty代码,我拼凑在一起,以了解这一点。感谢Josip为我指出了正确的方向:

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

Josip的答案很棒,让你走得这么远,但是,对于其他人来说,这是最好的(坚实的)答案,我想。感谢这两个。 – PandaWood 2010-02-18 02:10:57