Anmelden

View Full Version : Lesen IFS File mit korrekten Umlauten



Seiten : [1] 2

hteufl
26-09-13, 09:19
Hallo Specialists!

Ich habe ein Problem beim Lesen von IFS-Dateien die Umlaute enthalten. Ich weiß, dass das Thema schon zig mal behandelt wurde, aber die meisten Threads beziehen sich auf das Schreiben ins IFS. Ich erhalte also per FTP vom Kunden eine IFS-Textdatei die lt. Navigator die Codepage/CCSID 819 besitzt. Die Datei kann mit Windows Notepad korrekt gelesen werden - mit Umlauten!! In einem RPG Programm wird das IFS-File mit der C Routine read() gelesen.

// Lesen der IFS-Neu
flags = o_rdonly + o_creat + o_ccsid + o_textdata + o_text_creat;
mode = s_irusr + s_iwusr + s_irgrp + s_iroth;
fd = open(%trimr(path) + %trim(IFSFilename) : flags : mode : 1252 : 0);

Ich habe die CCSID 1141, 1252 850. 437 und 819 ausprobiert. In allen Fällen wird auf der AS/400 der Textstring falsch angezeigt! Ich bin mit meinem Latein am Ende und hoffe auf Eure Hilfe!

Danke im voraus
Hermann

Fuerchau
26-09-13, 09:55
Schau dir mal die Attribute (WRKLNK, CCSID) der Datei an bzw. mal mit Anzeige des Inhaltes.

hteufl
26-09-13, 10:05
Hallo Fuerchau!

Danke für die Antwort. Mit WRKLNK wird ebenfalls die CCSID 819 angezeigt. Mit der Auswahl 5 werden die Daten auch mit Fehlern angezeigt! Anbei ein kleiner Auszug:
"O1390714";"f.beyer@intelligent-group.com";"Bodenplatte für bestehende EKZ-Bremen Stele
"O1389816";"werner@momag.at";"Zeitungsdispenser, Ausführung Àhlnich wie Dispenser NÃ

Hermann

Fuerchau
26-09-13, 10:23
Das deutet auf UTF-8 hin:
"für"
Das "ü" wird in 2-Bytes übertragen, also wohl UTF-8, das ist dann CCSID 1208.

camouflage
26-09-13, 10:37
Falls es jemanden interessiert, hier wäre noch eine Lektüre zu IFS und RPG.

Working with the IFS in RPG IV (http://www.scottklement.com/rpg/ifs_ebook/)

hteufl
26-09-13, 11:03
Hallo Fuerchau!

Ich habe das IFS File mit der CCSID 1208 geöffnet und gelesen doch die Umlaute sind dennoch falsch. Anbei der Butter aus read():

"Angebotsnummer";"E-Mail";"Thema";"Datum";"Information";"Tex
t""O1390360";"tobias.eisemann@pool-alpin.com";"Klapprahmen (tobias.eisemann@pool-alpin.com";"Klapprahmen)
A0";"";"6";"""O1390714";"f.beyer@intelligent-group.com (f.beyer@intelligent-group.com)";"
Bodenplatte für bestehende EKZ-Bremen Stele ON91SO01";"";"5
";"""O1389816";"werner@momag.at";"Zeitungsdispenser (werner@momag.at";"Zeitungsdispenser), Ausführung Àhlnich wie Dispenser NÃ Landes- kliniken";"24.10.2

Bei den CCSID Experimenten ist mir aufgefallen, dass sich die Zeichen kaum ändern - vor allem die Umlaute!!

Die Doku von Scott Klement habe ich mir auch schon zu gemüte geführt. Doch gerade beim read() API steht nicht wirklich etwas über Zeichenkonvertierung.

Danke

Hermann

Fuerchau
26-09-13, 11:26
Die Zeichenkonvertierung wird eigentlich durch das Flag O_CCSID gesetzt und vom System dann automatisch durchgeführt.

Versuche doch erst mal alternativ einen CPYTOSTMF mit der entsprechenden Konvertierung (als Ziel eine PF mit CRTPF und Satzlänge ohne DDS) durchzuführen.

Besser ist es eigentlich, eine DDS/SQL-PF mit den Feldern anzulegen und einen CPYxxIMPF (ich weiß nie aus dem Kopf ob from oder to) durchzuführen.
Das spart erheblichen Programmieraufwand und erleichtert das spätere verarbeiten.

hteufl
26-09-13, 13:03
Hallo Fuerchau!

Du bist der Sache so glaube ich schon etwas näher gekommen.
Mit CPYFRMSTMF und Parameter STMFCCSID = 1208 und Parameter DBFCCSID = 1141 werden die Zeichen in einem PF korrekt angezeigt. Ein Versuch die Daten im RPG Modul mit den Parametern:

fd = open(%trimr(path) + %trim(IFSFilename) : flags : mode : 1208 : 1141);

zu ermitteln brachte erneut folgendes Ergebnis:
"Angebotsnummer";"E-Mail";"Thema";"Datum";"Information";"Tex
t"
"O1390360";"tobias.eisemann@pool-alpin.com";"Klapprahmen (tobias.eisemann@pool-alpin.com";"Klapprahmen)
A0";"";"6";"""O1390714";"f.beyer@intelligent-group.com (f.beyer@intelligent-group.com)";"
Bodenplatte für bestehende EKZ-Bremen Stele ON91SO01";"";"5
";""
"O1389816";"werner@momag.at";"Zeitungsdispenser (werner@momag.at";"Zeitungsdispenser), AusfÃ
¼hrung Àhlnich wie Dispenser NÃ Landes- kliniken";"24.10.2
013";"2";""
"O1389422";"p.steger@forster.at";"Test (p.steger@forster.at";"Test): E-Mail
Nacharbeit aus CRM";"24.11.2013";"2";""

Danke

Hermann

Fuerchau
26-09-13, 14:02
Vielleicht kommt der open() ein wenig durcheinander da die Flags nicht eindeutig sind:
flags = o_rdonly + o_creat + o_ccsid + o_textdata + o_text_creat;
Die roten Flags sind zu viel, da du die Datei ja nur lesen und nicht erstellen willst.

Laut Doku wird intern iconv() verwendet, es sollte also klappen.
open()--Open File (http://pic.dhe.ibm.com/infocenter/iseries/v7r1m0/topic/apis/open.htm?resultof=%22%6f%70%65%6e%28%29%22%20%22%6 f%70%65%22%20)

Verwirrend ist das Flag O_TEXT_CREATE:

When the O_TEXT_CREAT flag and its prerequisite flags are not set, the specified or derived CCSID is the CCSID in which data is to be returned (when reading from a file), or the CCSID in which data is being supplied (when writing to a file).

Versuche mal mit den diversen Flags zu spielen, aus der Doku werde auch ich nicht schlau wann und ob und von welcher in welche CCSID konvertiert wird.

Ich halte mich da eh an die CPYxxx-Befehle.

Nachtrag:
Per CHGATR (bzw. QSHELL "touch") kann man die CCSID der Datei anpassen.
Ggf. liegt es auch noch daran, da die ja wohl auf 819 (also ANSI) steht.

hteufl
27-09-13, 09:48
Hallo Fuerchau!

Meine Experimente mit den flag-Attributen (o_text_create, o_create) haben keine Änderung gebracht. Erst als ich mit Notepad++ die Kodierung auf ANSI geändert habe funktionierte der Datenupload (ohne Angabe einer CCSID). Interessant ist nur, dass der OPS-Navigator trotzdem den Zeichensatz 819 anzeigt. So wie es aussieht hat die AS/400 mit UDF-8 ziemliche Probleme.
Letztendlich heißt es für mich den Lieferanten der TXT Datei zu kontaktieren und ihn zu bitten die Datei in ANSI und nicht in UDF-8 zu erstellen.

Danke für die vorbildliche Unterstützung

Hermann