Anmelden

View Full Version : XML -> Spool -> Fremdsystem



Seiten : 1 2 3 4 [5]

Anton Gombkötö
27-08-13, 10:08
@Toschie: Aus meiner Sicht solltest Du nun eigentlich glücklich sein.
Was meinst mit aber mit "jedoch" und "alles"?
So soll es doch sein; Du schreibst das ja nun sicherlich in eine *USERASCII Spool-Datei.

@Fuerchau: das macht er ja schön, 2 Bytes zum Pointer dazugerechnet, damit er am Datenteil steht, und die Länge mit %LEN richtig initialisiert.
Noch schöner, sozusagen der Telemark, wäre nur noch die Initialisierung des Pointers mit

pData = %ADDR(Data:*DATA);

Fuerchau
27-08-13, 10:29
Wenn das Zielergebnis aber länger als die aktuelle Längenangabe ist, kommt man leider an die Zeichen hinter der Länge nur über eine Fixed-Char-Variable mit Based(Pointer) dran, da der normale Zugriff immer die Länge berücksichtigt. Bei CCSID 13488 wird das am deutlichsten.

Das "Ergebnis" ist allerdings immer noch EBCDIC und nicht UTF-8!
Also irgendwas stimmt da immer noch nicht mit der API-Versorgung.

Anton Gombkötö
27-08-13, 11:17
Und rechne mir die Länge aus (zur Verfügung gestellter Speicherplatz - von iconv übrig gelassener Speicherplatz). Das setze ich dann mit %LEN(variable) = ermittelter Wert.

Ja, das hatte er schon mal besser. :-)

Fuerchau
27-08-13, 12:04
Also hier mal ein simples Beispiel für das API CDRCVRT:



d CDRCVRT pr extpgm('CDRCVRT')
d CCSID1 10I 0
d ST1 10I 0
d S1 32766 options(*varsize)
d L1 10I 0
d CCSID2 10I 0
d ST2 10I 0
d GCCASN 10I 0
d L2 10I 0
d S2 32766 options(*varsize)
d L3 10I 0
d L4 10I 0
d FB 12

d ConvParm ds
d CCSID1 10I 0 inz(273)
d ST1 10I 0 inz(0)
d S1 100 inz
d L1 10I 0 inz(%size(S1))
d CCSID2 10I 0 inz(1208)
d ST2 10I 0 inz(0)
d GCCASN 10I 0 inz(0)
d L2 10I 0 inz(%size(S2))
d S2 100 inz
d L3 10I 0 inz
d L4 10I 0 inz
d FB 12
d FBCodes 10I 0 overlay(FB) dim(3)

c/free
S1='ABCÄä';
L1 = 5;
CDRCVRT(
CCSID1
:ST1
:S1
:L1
:CCSID2
:ST2
:GCCASN
:L2
:S2
:L3
:L4
:FB
);
return;
/end-free


S2 enthält den UTF8-Code und L3 dann die Länge.

Fuerchau
27-08-13, 12:52
Ich bekomme allerding iConv auch nicht zum Arbeiten.

Anton Gombkötö
27-08-13, 13:12
Vielleicht postest Du ihn mal? ;-)

Fuerchau
27-08-13, 13:36
Wen meinst du jetzt?
das 'CDRCVRT' funktioniert, allerdings komme ich auch beim C-API 'iconv' zu keinem Ergebnis.
Allerdings reicht mir ja das OPM-API :).

Anton Gombkötö
27-08-13, 13:46
Wär' ja gelacht, wenn man das nicht zum Laufen brächte.
Naja, aber irgendeinen Grund muss es ja geben, warum das alle verwenden und nicht das 'CDRCVRT'. (Von dem ich, ich gestehe, noch nie vorher was gehört hatte.)
Ich nehme an, es gibt einen Performancevorteil bei iconv, wenn man viel übersetzt.

Toschie
27-08-13, 13:59
Also hier mal ein simples Beispiel für das API CDRCVRT:



d CDRCVRT pr extpgm('CDRCVRT')
d CCSID1 10I 0
d ST1 10I 0
d S1 32766 options(*varsize)
d L1 10I 0
d CCSID2 10I 0
d ST2 10I 0
d GCCASN 10I 0
d L2 10I 0
d S2 32766 options(*varsize)
d L3 10I 0
d L4 10I 0
d FB 12

d ConvParm ds
d CCSID1 10I 0 inz(273)
d ST1 10I 0 inz(0)
d S1 100 inz
d L1 10I 0 inz(%size(S1))
d CCSID2 10I 0 inz(1208)
d ST2 10I 0 inz(0)
d GCCASN 10I 0 inz(0)
d L2 10I 0 inz(%size(S2))
d S2 100 inz
d L3 10I 0 inz
d L4 10I 0 inz
d FB 12
d FBCodes 10I 0 overlay(FB) dim(3)

c/free
S1='ABCÄä';
L1 = 5;
CDRCVRT(
CCSID1
:ST1
:S1
:L1
:CCSID2
:ST2
:GCCASN
:L2
:S2
:L3
:L4
:FB
);
return;
/end-free


S2 enthält den UTF8-Code und L3 dann die Länge.


@Fuerchau: Vielen Dank für dein Beispiel!
Allerdings wird bei mir aus
ABCÄä
der Wert
â{CdCu

Kann es vll sein, das es Darstellungsprobleme im RDI gibt?
Eher nein oder?

Fuerchau
27-08-13, 14:06
Kontrollieren kannst du den Wert nur mit Hex-Ausgabe:

41 42 43 C384 C3A4

Das ist UTF8 ABC
C384 = 'Ä'
C3A4 = 'ä'

ASCII-Zeichen lassen sich in EBCDIC halt nicht anzeigen, da kommt bei mir das selbe raus.