Autor Beitrag
Florian Wolf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20


C# (VS 2008)
BeitragVerfasst: Do 16.09.10 17:25 
Hallo,

ich muss für eine vorhandene Software eine Importdatei erzeugen.
Diese Software kann eine ä, ö und ü einlesen. Für das ü benötige ich z.b. das Zeichen 129 in der ASCII-Tabelle.
Ich schaffe es aber nicht dieses Zeichen in eine TextTatei zu schreiben.
Ich glaube es liegt an der Unicode Zeichencodierung, dass wenn ich in einen String das Zeichen 129 einfüge [über Stringvariable + Convert.ToChar(129)] ich immer an der stelle in meiner Textdatei zwei Zeichen habe [Zeichen 194 und Zeichen 129].
Gibt es eine Möglichkeit dass ich nur das Zeichen 129 schreiben kann?
Ich habe es auch schon versucht als Bytearray zu speichern, aber dann stand gar nichts mehr in meiner Datei.

Meine Datei lege ich wie folgt an:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
string strSchreiber;
string strDateiname;

strDateiname = Application.StartupPath + "\\ItemStructure.txt";
StreamWriter objWriter = new StreamWriter(strDateiname, true);
strSchreiber = "Los-f" + Convert.ToChar(129) + "r-Los";
objWriter.WriteLine(strSchreiber);



Moderiert von user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Do 16.09.2010 um 17:29
Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Do 16.09.10 18:30 
Hi,
ja, Zeichensätze bei Textdateien ist immer ein spannendes Thema :)
user profile iconFlorian Wolf hat folgendes geschrieben Zum zitierten Posting springen:
Für das ü benötige ich z.b. das Zeichen 129 in der ASCII-Tabelle

Stellt sich erst einmal die Frage, wie Du (oder aber die Software, für die Du die Importdateien schreiben sollst) auf den dezimalen Wert von 129 für das Zeichen "ü" kommt. Denn die normale, alte ASCII- Zeichentabelle geht nur bis 127 8)
Ganze 128 Zeichen. Alles, was darüber hinaus läuft, ist ANSI, UTF8, UTF16...
Und selbst bei der ANSI-Tabelle ist das Zeichen auf 129 ein "�". Und eigentlich wäre es ja für ANSI die 252.

Hast Du denn als Vorlage eine originale Importdatei?

Marko
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Do 16.09.10 19:40 
Wenn du einen .NET-String in seine Bytes in einer bestimmten Codierung konvertieren willst, kannst du die Klasse System.Text.Encoding verwenden. Für Ansi brauchst du 28591 als wert für den codepage-Parameter des Konstruktors. Anschließend kannst du ganz einfach die Methode GetBytes verwenden.
Florian Wolf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20


C# (VS 2008)
BeitragVerfasst: Fr 17.09.10 08:36 
user profile iconTrashkid2000 hat folgendes geschrieben Zum zitierten Posting springen:
Hi,
Stellt sich erst einmal die Frage, wie Du (oder aber die Software, für die Du die Importdateien schreiben sollst) auf den dezimalen Wert von 129 für das Zeichen "ü" kommt.

Ja, diese Frage habe ich mir auch gestellt und kann das nicht beantworten.
user profile iconTrashkid2000 hat folgendes geschrieben Zum zitierten Posting springen:

Denn die normale, alte ASCII- Zeichentabelle geht nur bis 127 8)
Ganze 128 Zeichen. Alles, was darüber hinaus läuft, ist ANSI, UTF8, UTF16...
Und selbst bei der ANSI-Tabelle ist das Zeichen auf 129 ein "�". Und eigentlich wäre es ja für ANSI die 252.

Hast Du denn als Vorlage eine originale Importdatei?

Marko

Ich habe eine Exportdatei. Dort wo in der Software ein ü steht ist in der Exportdatei ein "�" (Zeichen 129).

user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
Wenn du einen .NET-String in seine Bytes in einer bestimmten Codierung konvertieren willst, kannst du die Klasse System.Text.Encoding verwenden. Für Ansi brauchst du 28591 als wert für den codepage-Parameter des Konstruktors. Anschließend kannst du ganz einfach die Methode GetBytes verwenden.


Das klingt so, als ob mich das meinem Zeit näher bringen könnte. Leider vertstehe ich das nicht so ganz wie ich das umsetzen muss. Hättest du ein kleinen Stück Quellcode. Da wäre ich sehr dankbar.
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Fr 17.09.10 12:55 
Ist gar nicht so schwer, wie es klingt ;)

ausblenden C#-Quelltext
1:
byte[] data = new Encoding(28591).GetBytes("Bloß ein blöder Test mit Umlauten");					

In data ist dann ein Array mit Bytes, die du in die Datei schreiben musst, z.B. mit FileStream.

Noch einfacher geht's mit dem StreamWriter:

ausblenden C#-Quelltext
1:
2:
3:
using (StreamWriter writer = new StreamWriter(fileName, truenew Encoding(28591))) {
  writer.writeLine("Bloß ein blöder Test mit Umlauten");
}


Grüße,
Yogu
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Fr 17.09.10 15:50 
user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:

ausblenden C#-Quelltext
1:
byte[] data = new Encoding(28591).GetBytes("Bloß ein blöder Test mit Umlauten");					


Kurze Anmerkung: Encoding ist eine abstrakte Klasse und kann nicht instanziiert werden.

Es müsste dann also
ausblenden C#-Quelltext
1:
byte[] data = Encoding.GetEncoding(28591).GetBytes("Bloß ein blöder Test mit Umlauten");					

heißen.

Marko
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Fr 17.09.10 19:46 
user profile iconTrashkid2000 hat folgendes geschrieben Zum zitierten Posting springen:
Kurze Anmerkung: Encoding ist eine abstrakte Klasse und kann nicht instanziiert werden.

Oh mist, ich hab nur nach den Konstruktoren gesucht und gesehen, dass einer mit einem int-Parameter existiert. Dass dieser protected ist, hab ich übersehen :oops:
Florian Wolf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20


C# (VS 2008)
BeitragVerfasst: Mo 20.09.10 09:12 
Danke Yogu und Trashkid2000.

Über
ausblenden Quelltext
1:
StreamWriter writer = new StreamWriter(fileName, true, new Encoding.GetEncoding(28591));					

konnte ich mein Problem lösen.

Die Hilfe von Visual Studio hat mich dann mit eurer Hilfe zusammen soweit gebracht, dass ich gleich die Codepage 437 benutzt habe, denn darin ist das ü an der Stelle 129 und somit kann ich die Datei für den Import komplett korrekt codieren.

Vielen Dank ihr habt mir sehr geholfen.