it-swarm.com.de

C # Hilft beim Lesen fremder Zeichen mit StreamReader

Ich verwende den folgenden Code, um eine Textdatei zu lesen, die fremde Zeichen enthält. Die Datei ist ANSI-codiert und sieht im Editor gut aus. Der folgende Code funktioniert nicht, wenn die Dateiwerte gelesen und im Datagrid angezeigt werden und die Zeichen als Quadrate angezeigt werden. Kann es an anderer Stelle ein anderes Problem geben?

StreamReader reader = new StreamReader(inputFilePath, System.Text.Encoding.ANSI);
using (reader = File.OpenText(inputFilePath))

Vielen Dank

Update 1 : Ich habe alle unter System.Text.Encoding gefundenen Kodierungen ausprobiert. und alle zeigen die Datei nicht korrekt an.

Update 2 : Ich habe die Dateicodierung geändert (die Datei erneut gespeichert), in Unicode geändert und System.Text.Encoding.Unicode verwendet, und es hat gut funktioniert. Warum hat notepad es richtig gelesen? Und warum hat System.Text.Encoding.Unicode die ANSI-Datei nicht gelesen?

55
Scott

Ja, es könnte sich um die tatsächliche Kodierung der Datei handeln, wahrscheinlich um Unicode. Versuchen Sie es mit UTF-8, da dies die häufigste Form der Unicode-Kodierung ist. Andernfalls, wenn die Datei ASCII, sollte die Standardcodierung ASCII funktionieren.

23

Sie können auch die Standardcodierung versuchen, bei der die ANSI-Codepage des aktuellen Systems verwendet wird.

StreamReader reader = new StreamReader(inputFilePath, Encoding.Default, true)

Wenn Sie versuchen, das Notepad-Menü "Speichern unter" mit der Originaldatei zu verwenden, sehen Sie sich das Kombinationsfeld für die Kodierung an. Es wird Ihnen angezeigt, welcher Notizblock für die Kodierung von der Datei verwendet wird.

Wenn es sich um eine ANSI-Datei handelt, hilft der Parameter detectEncodingFromByteOrderMarks wahrscheinlich nicht viel.

117
Jerome Laban

Ich hatte das gleiche Problem und meine Lösung war einfach: Statt

Encoding.ASCII

benutzen

Encoding.GetEncoding("iso-8859-1")

Die Antwort wurde gefunden hier .

Edit: mehr Lösungen. Dieser vielleicht genauere:

Encoding.GetEncoding(1252);

In einigen Fällen funktioniert dies auch für Sie, wenn die Standardcodierung Ihres Betriebssystems der Dateicodierung entspricht:

Encoding.Default;
21
serop

Die Verwendung von Encoding.Unicode decodiert eine ANSI-Datei nicht genau so, wie ein JPEG-Decoder eine GIF-Datei nicht versteht.

Ich bin überrascht, dass Encoding.Default für die ANSI-Datei nicht funktioniert hat, wenn es wirklich war ANSI - wenn Sie jemals herausfinden, welche Codepage Notepad verwendet hat, können Sie Encoding.GetEncoding(int) verwenden.

Generell empfehle ich, wenn möglich, UTF-8 zu verwenden.

8
Jon Skeet

Versuchen Sie eine andere Codierung wie Encoding.UTF8. Sie können auch versuchen, StreamReader die Kodierung selbst finden zu lassen:

    StreamReader reader = new StreamReader(inputFilePath, System.Text.Encoding.UTF8, true)

Bearbeiten: Ich habe gerade Ihr Update gesehen. Versuchen Sie, StreamReader das Erraten zu lassen.

7

File.OpenText () verwendet implizit immer einen UTF-8 StreamReader. Erstellen Sie Ihren eigenen StreamReader stattdessen eine Instanz und geben Sie die gewünschte Kodierung an 

using (StreamReader reader =  new StreamReader(@"C:\test.txt", Encoding.Default)
 {
 // ...
 }
3
Anonymous

Ich habe mein Problem gelöst, portugiesische Zeichen zu lesen und die Quelldatei in Notepad ++ zu ändern.

enter image description here

c #  

    var url = System.Web.HttpContext.Current.Server.MapPath(@"~/Content/data.json");
    string s = string.Empty;
    using (System.IO.StreamReader sr = new System.IO.StreamReader(url, System.Text.Encoding.UTF8,true))
    {
          s = sr.ReadToEnd();
    }
0
Luís Ponciano

Ich lese auch eine exportierte Datei, die Französisch und Deutsch enthält. Ich habe Encoding.GetEncoding ("iso-8859-1") verwendet, das hat ohne Probleme funktioniert.

0
A. Lartey

für Arabisch habe ich Encoding.GetEncoding(1256) verwendet. es funktioniert gut.

0
Muhamad Suliman

Für Schweden war die einzige Lösung, die oben beschrieben wurde:

Encoding.GetEncoding("iso-8859-1")

Hoffentlich spart das jemand Zeit.

0
jagge123