Liebes Forum,
auch wenn ich jetzt Gefahr laufe mir einen 11 Meter ein zu handeln, mache ich hier noch mal wieder einen Post zum Zeichensatz auf.
Meine Kundschaft bekommt von einem Externen Partner per Mail eine Datei mit Daten. Diese waren bis jetzt immer UFT-8.
Jetzt kommt die Datei aber mit UCS-2 LE BOM (Sagt zu mindestens der Notpad++).
Wenn ich die Dateien im IFS speichere, und mit WRKLNK mir den Inhalt anschaue, dann passt das bei den UFT-8, aber bei der anderen Datei nicht. Bei „Anzeige Attribute“ steht bei beiden die 1252.
Beim kopieren mit CPYFRMIMPF in eine PF wird auch nicht konvertiert.
Im Moment öffne ich die Datei mit dem Notepad++ und speichere die Datei dann neu mit UFT-8 ab.
Wie bekomme ich die Daten jetzt lesbar in eine PF geschrieben?
Danke schon einmal
Ronald
Die CCSID einer Datei bei der Kopie ins IFS wird durch den Netserver festgelegt.
Daher kann die CCSID in diesem Fall keine Aussage über den Inhalt machen.
Du musst also hier tasächlich beim CPYFRMIMPF die CCSID 13488 für UCS-2 angeben.
Ggf. gibt es ein Problem mit den 2-Byte BOM am Anfang.
UTF-8 ist CCSID 1208, das geht beim CPYFRMIMPF ebenso.
Wenn das mit 13488 (wieder mal) nicht funktionieren sollte, kann man auch mit QSH "iconv" ggf. eine Codewandlung in 1208 durchführen.
Du hast da leider tatsächlich ein Problem, da die Quelldaten in LE (Little Endian) gespeichert wird und die AS/400 in Big Endian arbeitet (LE "0" = X'3000', BE "0" = X'0030').
Für SQL gibts nur den Translate.
Mangels Daten habe ich es noch nicht ausprobiert, aber versuche doch fogendes:
dcl-f MyFile Usage(*Input: *Update) ; // Daten vom externen Partner
// Konstanten dcl-c True *On; dcl-c False *Off;
// Main-Programm Setll *Start MyFile; // Alles auf Anfang Read MyFile; // 1.Satz lesen DoW not %EoF( MyFile ); // Lesen bis zum bitteren Ende Satz = Gueltige_Zeichen( Satz ); // Nur Blanks und Ziffern bleiben Update MyFileF; // Update auf den Record Read MyFile; // Und ab zum nächsten Record EndDo; // Ende der Schleife
*Inlr = True; // Endezeiger einschalten
// Prozeduren dcl-proc Gueltige_Zeichen; // Alles töten was nicht x'40' oder dcl-pi *n char( 80 ); // x'F0' bis x'F9' ist Zeile char( 80 ); // Übergabe des String end-pi; dcl-s Rueckgabe char( 80 ); // Rückgabe_String dcl-s Text char( 80 ); // Hier gibt es den Übergabe Text dcl-s Zeichen char( 1 ); // Zu überprüfendes Zeichen dcl-s Index packed( 4: 0 ); // Index für Zerlegen des Strings Text = Zeile; // Erstmal den ganzen Text For Index = 1 to %Len( %Trim( Text )); // Alles durch ackern Zeichen = %SubSt( Text : Index: 1); // zu prüfendes Zeichen If Zeichen = x'40'; // Leerzeichen Rueckgabe = %Trim( Rueckgabe ) + 'Q'; // Platzhalter für das Blank EndIf; If (Zeichen >= x'F0' and Zeichen <= x'F9'); // Ziffer Rueckgabe = %Trim( Rueckgabe ) + Zeichen; // Zeichen geht mit zurück EndIf; EndFor; // Platzhalter wieder mit Blanks ersetzen Rueckgabe = %ScanRpl( 'Q': ' ': Rueckgabe); // Und das Ergebniss zurück geben Return Rueckgabe; end-proc;
Ich, als alter Nostalgiker ... dies ist eine RPG variante, das F in der 'H-Karte' ist das Geheimnis
Code:
H .D F HEXJO
FINPUT IP F 250 DISK
FOUTPUT O F 250 DISK A
I* ----------------------------------------------------------------------
IINPUT KF 01
I 1 250 S1
OOUTPUT DADD 01
O S1 250
**
INPUT 00400140024003400440054006400740084009400A400B400C400D400E400F40
INPUT immer althex neuhex, sooft wie nötig
Das Notwendige steht über dem technisch machbaren.
(klingt komisch, funktioniert aber!)
Bookmarks