Anmelden

View Full Version : UCS-2



malzusrex
15-05-17, 13:52
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

Fuerchau
15-05-17, 14:03
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.

malzusrex
19-05-17, 07:10
HI,

habe jetzt CPYTOIMPF mit mehreren CCSID getestet. Das inconv hat mich auch nicht zum Ziel gebracht.

Habe ich mit SQL eine Möglichkeit aus einem Feld alle Zeichen zu killen, die nicht x'40' und x'F0' - x'F9' sind?

Gruß
Ronald

Fuerchau
19-05-17, 09:04
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:

iconv -f UTF-16LE -t UTF-8 filename > Zieldatei

für nicht übersetzbare Zeichen gibts noch "-c".

malzusrex
19-05-17, 09:20
hat leider auch noch nicht zum Erfolg geführt.

Werde jetzt mit einem kleinen RPG die Datei lesen und alles löschen was nicht x'40' oder
x'F0' - x'F9' ist

Gruß
Ronald

malzusrex
19-05-17, 10:17
So,
mache die Daten jetzt mit einen RPG "Hübsch"

Die daten wurden aus dem IFS in eine Datei MyFile kopiert. Diese Datei hat ein Feld Satz mit der Länge 80 und den Format MyFileF.



ctl-opt dftactgrp(*no) bnddir('QC2LE') Option( *NoDebugIO )
datfmt(*DMY.) timfmt(*HMS:) datedit(*DMY.) Decedit('0,') Debug(*YES);

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;


Gruß Ronald

Robi
19-05-17, 10:30
Ich, als alter Nostalgiker ... dies ist eine RPG variante, das F in der 'H-Karte' ist das Geheimnis



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 00400140024003400440054006400740084009400A400B400C 400D400E400F40
INPUT immer althex neuhex, sooft wie nötig