2008-12-11 7 views
8

Beim Parsen von HTML für bestimmte Webseiten (vor allem Windows-Live-Seiten) stoße ich auf viele URLs im folgenden Format.Suche nach einer Parsing-API für teilweise utf8-codierte URLs

http \ X3A \ X2f \ x2fjs.wlxrs.com \ x2fjt6xQREgnzkhGufPqwcJjg \ x2fempty.htm

Diese erscheinen teilweise zu UTF8 Strings entkam (\ X2f =/\ = X3A :, etc ...). Gibt es eine .NET-API, mit der diese Zeichenfolgen in eine System.Uri umgewandelt werden können? Scheint einfach zu parsen, aber ich versuche heute zu vermeiden, ein neues Rad zu bauen.

+0

FYI. Bitte beachten Sie, dass das Einfügen dieser URL als String in der Browser-Konsole die korrekte Ausgabe liefert. (nicht realted, aber FYI) http://i.stack.imgur.com/2md5D.jpg –

+0

und hier ist das Online-Tool mit ihm zu spielen ... http: //www.javascriptobfuscator.com/Default.aspx –

Antwort

3

Was Sie gepostet haben, ist kein gültiges HTTP. Daher wird HttpUtility.UrlDecode() natürlich nicht funktionieren. Aber unabhängig davon, dass, können Sie diese wieder in normalen Text wie folgt drehen:

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()); 

aber feststellen, dass dies setzt voraus, dass die Codierung Latin-1 eher als UTF-8. Ihre Eingaben sind in dieser Hinsicht nicht eindeutig. Wenn Sie UTF-8 benötigen, benötigen Sie eine etwas längere Route. Sie müssen die Zeichenfolge in Bytes konvertieren und die Escape-Sequenzen durch die relevanten Bytes im Prozess ersetzen (benötigt wahrscheinlich eine while-Schleife) und dann Encoding.UTF8.GetString() für das resultierende Byte-Array verwenden.

+0

Was meinst du mit _UTF-8 zu arbeiten_? Er hat eine Zeichenfolge, die standardmäßig Unicode ist. können Sie erklären? (p.s. +1) –

+1

@RoyiNamir: Sein Beispiel enthält nur ASCII-Zeichen. Es ist unklar, wie er erwartet, dass Nicht-ASCII-Zeichen codiert werden, sagen wir "á". Wenn es als '\ xe1' codiert ist, dann ist es Latin-1 (nicht Unicode). Wenn es als '\ xc3 \ xa1' codiert ist, dann ist es UTF-8, was bedeutet, dass mehrere Bytes verwendet werden, um ein einzelnes Zeichen zu codieren. Da seine Kodierung nach dem '\ x' zwei Hexadezimalstellen anzunehmen scheint, kann UTF-16 oder UTF-32 nicht verwendet werden. – Timwi

+0

wenn ich in der Konsole '\ xe1' schreibe, stellt es eine Unicode-Zeichenkette oder eine utf8-Kodierung dar? Wie geht js damit um? –

0

hier eine andere Lösung: (von @timwi Lösung fortgesetzt) ​​

string output = Regex.Replace(input, @"\\x([0-9a-f][0-9a-f])", 
      m => ((char)Convert.ToInt32(m.Groups[1].Value, 16)).ToString()); 
Verwandte Themen