[gelöst] Encoding in Textdatei

6. Juni 2016 15:41

Hallo zusammen!

Wir haben scheinbar ein Encodingproblem und sind zu jung um zu verstehen was da schiefläuft. :lol:
Einer unserer Kunden hat ein Upgrade von NAV2009 auf NAV2015 bekommen. Dieser Kunde setzt ein altertümliches Komissionierungsmobil ein, welches mit einer Binärdatei befüttert wird (Textmode=FALSE).
Im Prinzip wird hier u.A. eine Menge übergeben indem ein INT-Wert in ein Charakterfeld geschoben wird und dieses Character-Feld dann in die Datei geschreiben wird.
Um unser Problem einmal auf den Punkt zu bringen, haben wir eine Testcodeunit mit folgendem Code erstellt:

Code:
fFile.CREATE('C:\test.dat');
fFile.TEXTMODE(FALSE);
charfeld := 177;
fFile.WRITE(charfeld);
fFile.close;


Führt man diesen Code in NAV 2009 und in NAV 2015 aus bekommt man mit einem HEX-Editor betrachtet ein unterschiedliches Ergebnis.
NAV 2009 schrieb 1Byte mit dem Dezimalwert 177. NAV 2015 schreibt (ohne angabe eines TextEncodings) 1Byte mit dem Dezimalwert 241.

Folgendes haben wir bereits versucht:
- verschiedene Encodings, jedoch ist alles moderne was mehr als ein Byte schreibt wie UTF8 oder UTF16 nicht hilfreich, da wir pro Zeichen nur genau ein Byte schreiben dürfen.
- Schreiben der Datei via Outsrteam mit dotNet, auch hier verschiedene Encodings getestet
- ASCII2ANSI von Timo.

Schlussendlich war es uns technisch nicht möglich mit NAV 2015 ein Byte mit dem Dezimalwert 177 in die Datei zu schreiben.
Warum geht das nicht mehr?

Viele Grüße

Christian
Zuletzt geändert von christiand am 6. Juni 2016 16:53, insgesamt 2-mal geändert.

Re: Encoding in Textdatei

6. Juni 2016 16:03

Du hast Glück, dass ich quasi vor dem gleichen Problem stand ;-)
Allerdings benutzen wir einen NAV OutStream; ohne habe ich es noch nicht probiert.
Eines der Probleme war außerdem das hier; vielleicht ist es dir noch nicht aufgefallen: viewtopic.php?f=68&t=31460 (das Thema habe ich noch nicht aktualisiert, aber ich habe schon Neuigkeiten)

Sofern du Character-weise Dateien in NAV 2009 geschrieben hast, und die Datei soll in NAV 2016 genauso herauskommen wie vorher, versuche mal bitte folgendes (ohne Streaming habe ich das nicht ausprobiert ...):
Erstelle eine Textvariable der Länge 1.
Code:
fFile.CREATE('C:\test.dat');
fFile.TEXTMODE(FALSE);
charfeld := 177;
Textvariable := FORMAT(charfeld);
fFile.WRITETEXT(Textvariable); // nicht Char, sondern Text übergeben; WRITTEXT statt WRITE, um keine 00 anzuhängen.
fFile.close;

Re: Encoding in Textdatei

6. Juni 2016 16:34

Hey Natalie, vielen Dank, das funktioniert tatsächlich!

Der Vollständigkeit halber nochmal den Code der zum Ziel führte, (du hattest den Outstream vergessen)
Code:
fFile.TEXTMODE(FALSE);
fFile.CREATE('C:\dm\test.dat',TEXTENCODING::Windows);
fFile.CREATEOUTSTREAM(os);
charfeld := 177;
onetext := FORMAT(charfeld);
os.WRITETEXT(onetext); // nicht Char, sondern Text übergeben; WRITTEXT statt WRITE, um keine 00 anzuhängen.
fFile.CLOSE;


Textencoding Windows musste ich noch wählen, da er mir sonst immer irgend ein Start-Byte vorangestellt hat.
Mit dieser Einstellung schaffe ich es tatsächlich nur ein Byte mit Dez 177 zu schreiben.
Mal sehen ob wir das Mobil so zum fahren bewegen können.
Ich schulde dir was :wink:

Viele Grüße

Christian

Re: [gelöst] Encoding in Textdatei

7. Juni 2016 08:44

Schade, jetzt funktionieren andere Zeichen nicht mehr. Beispielsweise wird nun für alle Characters zwischen Dez 130 und 140 ein- und das selbe Zeichen rausgeschreiben.
Immer Dez. 63 Hex 3F. Ich versteh das nicht :-?

Re: [gelöst] Encoding in Textdatei

7. Juni 2016 10:35

christiand hat geschrieben:Schade, jetzt funktionieren andere Zeichen nicht mehr. Beispielsweise wird nun für alle Characters zwischen Dez 130 und 140 ein- und das selbe Zeichen rausgeschreiben.
Immer Dez. 63 Hex 3F.

Hm schade. Mir stellte sich das Problem nicht, weil wir vorher nie andere Zeichen als Buchstaben und CRLF geschrieben haben.
Wenn du z.B. Dez 130 ausnahmsweise wieder als Char statt Text schreibst, was landet dann in der Datei?

Und noch ein Wort zum Encoding: Mich hatte gewundert, dass du Windows genommen hast bzw. nehmen musstest. Denn der Standard-Encoding-Wert ist MsDos - heute wie damals. Versuch mal bitte daher MsDos.

Re: [gelöst] Encoding in Textdatei

7. Juni 2016 10:40

Hallo,

warum benutzt du WRITETEXT und nicht WRITE, wenn du ein Byte da hin haben möchtest?

Gruß Fiddi

Re: [gelöst] Encoding in Textdatei

7. Juni 2016 11:26

Hi fiddi,

das mache ich weil Natalie ja geschrieben hat dass write immer ein abschließendes 00 Byte erzeugt.
Ich hab das Problem jetzt aber dann doch noch mit dotnet gelöst bekommen:

Code:
fFile.CREATE('C:\tmp\test.dat');
fFile.TEXTMODE(FALSE);
fFile.CREATEOUTSTREAM(os);
streamWriter := streamWriter.StreamWriter(os, encoding.GetEncoding('ISO-8859-1'));
charfeld := 128;
streamWriter.Write(charfeld);
streamWriter.Close;
fFile.CLOSE;


Ich habe hiermit alle Werte von 0 bis 255 durchprobiert, und bekomme ein identisches Ergebnis zu NAV 2009.
Diese Codepage ISO-8859-1 scheint wohl der Standard für 8-Bit Ascii zu sein.