2016-08-03 8 views
-1

Ich habe Probleme beim Lesen einer Datei, die eine Mischung aus arabischem und westlichem Text enthält. Ich lese die Datei in einem Text wie folgt:So legen Sie die Stückliste für eine gelesene Datei fest

tbx1.Text = File.ReadAllText(fileName.Text, Encoding.UTF8); 

Egal welchen Wert ich versuchte, statt „Encoding.UTF8“ Ich habe Zeichen anstelle des arabischen angezeigt verstümmelt. Der westliche Text wurde gut angezeigt.

Ich dachte, es ein Problem mit der Art und Weise gewesen sein könnte die TextBox definiert wurde, aber beim Start ich einig gemischten Western/arabischen Text in das Textfeld schreiben und dies zeigt in Ordnung:

tbx1.Text = "Start السلا عليكم" + Environment.NewLine + "Here"; 

Dann öffnete ich Notepad und kopierte den obigen Text hinein, dann speicherte die Datei, zu welchem ​​Zeitpunkt Notepad save dialogue nach der zu verwendenden Kodierung fragte.

enter image description here

Ich stellte dann die gespeicherte Datei auf meinen Code und es angezeigt, die alle richtig Inhalt.

suchte ich die Datei und fand 3 Binärbytes am Anfang (nicht sichtbar in Notepad):

enter image description here

Die 3 Bytes, ich anschließend durch Forschung fand die BOM darstellen, und dies ermöglicht die C# "File.ReadAllText (Dateiname.Text, Encoding.UTF8);" um die Daten wie gewünscht zu lesen/anzuzeigen.

Was mich verwirrt ist die Angabe der "Encoding.UTF8" -Wert sollte dafür sorgen.

Die einzige Möglichkeit, die ich denken kann, ist, einen Schritt zu programmieren, um diese Daten zu einer Kopie der Datei hinzuzufügen, und dann diese Datei zu verarbeiten. Aber das scheint ziemlich langatmig. Ich frage mich nur, ob es einen besseren Weg gibt, oder warum die Encoding.UTF8 nicht das gewünschte Ergebnis liefert.

Edit:

Noch kein Glück trotz der Vorschlag in der Antwort versucht.

enter image description here

-Code wie folgt:

FileStream fs = new FileStream(fileName.Text, FileMode.Open); 
StreamReader sr = new StreamReader(fs, Encoding.UTF8, false); 
tbx1.Text = sr.ReadToEnd(); 
sr.Close(); 
fs.Close(); 

Versuchte sowohl mit „wahr“ und „falsch“ auf der 2. wie folgt

schneide ich die Testdaten nach unten nur Arabisch zu enthalten, Linie, aber beide geben das gleiche Ergebnis.

Wenn ich die Datei in Notepad ++ öffne und den arabischen ISO-8859-6-Zeichensatz festlege, wird der Inhalt angezeigt. Hier

ist, was ist wie in Notepad sieht ++ (und was würde ich die Textbox liek anzuzeigen):

enter image description here

Nicht sicher, ob das Problem in der Lesung aus der Datei ist, oder das Schreiben in dem Textfeld.

Ich werde versuchen, die Daten lesen gelesen zu lesen. Aber im Moment bin ich verwirrt.

+0

http://stackoverflow.com/questions/2223882/whats-different-between-utf-8-and-utf-8-without-bom –

+0

Sie wahrscheinlich die Datei zeigte nach Notepad es schrieb, doesn, dass‘ t helfen. Eine Stückliste ist umstritten, Unix-Betriebssysteme haben utf-8 übernommen, aber die meisten Dienstprogramme können eine Stückliste nicht korrekt verarbeiten. Wenn Sie Encoding.UTF8 übergeben, überlassen Sie es der Klasse File weiterhin, die Stückliste zu erkennen und Ihre Auswahl zu überschreiben, wenn sie eine hat. Aktualisieren Sie Ihren Hex-Dump mit dem tatsächlichen Dateiinhalt. –

+1

Sind Sie sicher, dass die Bytes, die die arabischen Zeichen sein sollen, tatsächlich die korrekte UTF8-Darstellung dieser Zeichen sind? Ich habe sehr häufig Zeichen gesehen, die als UTF8 übergeben werden, aber tatsächlich sind Bytes aus einem anderen Zeichensatz (wie ISO-8859-6 oder Windows-1256). Das führt zu Anzeigeproblemen wie diesem. –

Antwort

2

Die StreamReader Klasse hat eine constructor, die Pflege von Tests für die Stückliste für Sie nehmen:

using (var stream = new FileStream(fileName.Text, FileAccess.Read)) 
{ 
    using (var sr = new StreamReader(stream, Encoding.UTF8, true)) 
    { 
     var text = sr.ReadToEnd(); 
    } 
} 

Der letzte true Parameter ist detectEncodingFromByteOrderMark:

Die detectEncodingFromByteOrderMarks Parameter erfasst die Codierung durch Betrachten der ersten drei Bytes des Streams. Er erkennt automatisch:

  • UTF-8
  • Little-Endian-Unicode
  • und Big-Endian-Unicode-Text

, wenn die Datei beginnt mit den entsprechenden Byte-Reihenfolge Marken. Andernfalls wird die vom Benutzer bereitgestellte Codierung verwendet. Weitere Informationen finden Sie in der Encoding.GetPreamble Methode .

+0

Danke Dean. Deine Antwort macht Sinn, aber ich kann immer noch nicht das gewünschte Ergebnis erzielen. Bitte sehen Sie meine "Bearbeiten" zu der Frage, um die Ergebnisse nach dem Versuch, Ihren Vorschlag zu sehen. – TenG