2016-04-18 10 views
0

Ich benutze WebClient.DownloadFile in C#, um Webseiten herunterzuladen. Sie können problemlos heruntergeladen werden, die Codierung ist jedoch häufig nicht eindeutig (keine Stückliste vorhanden). Der Mozilla Universal Charset Detector (port 1, port 2) bietet ein System zur Erkennung der Codierung von Klartextdateien mit Heuristiken und this bietet eine noch einfachere Methode, die weniger Codierungen erkennt.Wie man eine Webseite in UTF8 unabhängig von ihrer Codierung entschlüsselt

Also erstens sind HTML-Webseiten sogar in seltsamen Kodierungen wie Shift-JIS und EUC-KR kodiert? Wenn nicht, kann eine schnellere Erkennungsmethode verwendet werden, die davon ausgeht, dass es sich um ASCII/ANSI oder UTF8 handelt.

Zweitens, wie geht man nach dem Erkennen der Codierung, um die byte[] der Datei in eine geeignete UTF8-Zeichenfolge zu dekodieren? Und kann ich nach einer String-Verarbeitung die Datei mit einer UTF8-Stückliste wieder auf den Datenträger speichern? Oder müsste ich zusätzliche Tags wie <meta charset="utf-8".."> in die HTML-Datei hinzufügen?

+0

ich hatte das gleiche Problem. Die deklarierte Codierung ist manchmal völlig falsch (ganz zu schweigen davon, dass es im Text der Webseite deklariert ist, die zuerst entschlüsselt werden muss http://www.w3schools.com/tags/att_meta_charset.asp), die Stückliste ist fast immer vermisst. Ich denke, Heuristiken sind die einzig vernünftige Lösung. –

Antwort

1

Der Zeichensatz einer Webseite sollte durch die content-type reponse header, especially the charset attribute beschrieben werden, ist es aber normalerweise nicht. Manchmal gibt es eine <meta http-equiv="content-type" />, aber wenn auch das fehlt, sind alle Wetten aus und Sie müssen die tatsächliche Codierung erkennen.

Sie scheinen also auf dem richtigen Weg nach vorne zu sein.

sind HTML-Webseite verschlüsselten auch in fremden Codierungen

, die auf den Seiten hängen Sie anfordern.

Wie wird man das Byte [] der Datei in eine passende UTF8-Zeichenfolge dekodieren?

Sie wollen nicht. Zeichenfolgen in .NET werden intern als UTF-16 codiert, und alle Dienstprogrammfunktionen arbeiten mit diesem Format.

So string content = Encoding.GetEncoding(yourDetectedEncoding).GetString(contentBytes) wird gut tun.

Dann können Sie diese schreiben UTF-16 codiert content String zurück in eine UTF-8-codierte Datei, mit BOM:

File.WriteAllText(path, content, Encoding.UTF8); 
+0

Mit 'passender UTF8-Zeichenfolge?' Meinte ich das Zeichenfolgenformat, das C# benötigt. Also du, UTF-16. –

+0

@Harsh ja, also dann ist das UTF-16. – CodeCaster