2009-02-26 8 views
49

Ich verwende den folgenden Code, um eine Textdatei zu lesen, die fremde Zeichen enthält, die Datei ist ANSI codiert und sieht gut im Editor aus. Der folgende Code funktioniert nicht. Wenn die Dateiwerte gelesen und im Datagrid angezeigt werden, erscheinen die Zeichen als Quadrate. Könnte es anderswo ein anderes Problem geben?C# Hilfe beim Lesen von fremden Zeichen mit StreamReader

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

Dank

Update 1: Ich habe alle unter System.Text.Encoding gefunden Codierungen versucht. und alle zeigen die Datei nicht korrekt an.

Update 2: Ich habe die Dateicodierung geändert (die Datei neu gespeichert), um Unicode und System.Text.Encoding.Unicode verwendet und es funktionierte gut. Warum also hat Notepad es richtig gelesen? Und warum nicht System.Text.Encoding.Unicode die ANSI-Datei gelesen?

+0

Sind Sie sicher, dass es in ANSI codiert ist? Manchmal versucht der Editor eine "optimale Schätzung" und verwendet eine andere Codierung als erwartet. –

+0

Wenn Notepad feststellt, dass eine Datei nicht Unicode oder UTF-8 ist, greift sie auf das Gebietsschema des Systems zurück (eingestellt im Bedienfeld -> Bereich Region und Sprache). –

Antwort

21

Ja, könnte es mit der tatsächlichen Codierung der Datei sein, wahrscheinlich Unicode. Probieren Sie UTF-8 aus, da dies die gebräuchlichste Form der Unicode-Codierung ist. Ansonsten sollte bei der Datei ASCII dann die Standard-ASCII-Codierung funktionieren.

+0

UTF8Encoding.UTF8 arbeitete für mich. –

5

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

Edit: Just sah Ihr Update. Versuchen Sie, StreamReader das Raten zu ermöglichen.

108

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

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

Wenn Sie versuchen, mit dem Notepad „Speichern unter“ Menü mit der Original-Datei, sehen Sie die Codierung Kombinationsfeld. Es wird Ihnen sagen, welche Codierung Notepad von der Datei verwendet wird.

Auch wenn es eine ANSI-Datei ist, wird der Parameter detectEncodingFromByteOrderMarks wahrscheinlich nicht viel helfen.

+1

Die Verwendung der Standard-Codierung funktionierte für mich. Ich hatte das char(), das von StreamReader übersprungen wurde und änderte es in die Standardcodierung, die korrekt gelesen werden darf. Vielen Dank! – buzzzzjay

+1

Encoding.Default funktionierte für mich ... Spanische Zeichen im ANSI-Format würden gelesen und geschrieben werden wie%^und? bevor Sie Encoding.Default verwenden. – BoilerBrad

+0

Encoding.Default funktioniert auch für mich. Portugiesische Zeichen hier in der Gegend. –

8

Verwenden von Encoding.Unicode wird eine ANSI-Datei nicht genau so dekodieren, wie ein JPEG-Decoder eine GIF-Datei nicht versteht.

Ich bin überrascht, dass Encoding.Default nicht für die ANSI-Datei nicht funktioniert, wenn es wirklich ANSI war - wenn Sie jemals genau die Codepage Editor wurde mit herauszufinden, könnten Sie Encoding.GetEncoding(int) verwenden.

Im Allgemeinen, wo möglich, würde ich UTF-8 empfehlen.

3

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

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

hatte ich das gleiche Problem und meine Lösung war einfach: statt

Encoding.ASCII 

Verwendung

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

Die Antwort wurde here gefunden.

Edit: mehr Lösungen. Dies vielleicht genauer ein:

Encoding.GetEncoding(1252); 

Auch in einigen Fällen wird dies auch für Sie arbeiten, wenn Ihr OS Standard-Kodierung Dateicodierung übereinstimmt:

Encoding.Default; 
+0

Mein Problem war 'StringBuilder' und Ausgabe auf' HttpResponseMessage', und die Akzente wurden ersetzt. Das hat funktioniert ('result' ist' HttpResponseMessage') 'result.Content = new StringContent (csv.ToString(), Encoding.GetEncoding (" iso-8859-1 "));' –

+0

Das war ich auch. Aus irgendeinem Grund funktionierte 'new StreamReader (memoryStream, Encoding.UTF8)' nicht, aber 'new StreamReader (memoryStream, Encoding.GetEncoding (" iso-8859-1 "))' tat! –

+0

Mein Problem mit einem ¾ (extended ascii, nicht unicode), das jemand benutzt hat, wurde behoben. –

0

ich mein Problem des Lesens portugiesischen Zeichen gelöst, Ändern die Quelldatei in Notepad ++.

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

für Arabisch, benutzte ich Encoding.GetEncoding(1256). es funktioniert gut.

Verwandte Themen