-
Habe jetzt folgendes Testprogramm mal aufgebaut:
Code:
H DEBUG DECEDIT('0,') DATEDIT(*DMY.) DFTACTGRP(*NO)
D QtqCode_T DS Qualified
D CCSID 10I 0 Inz(0)
D CvtAlt 10I 0 Inz(0)
D SubAlt 10I 0 Inz(0)
D ShiftState 10I 0 Inz(1)
D InLenOpt 10I 0 Inz(0)
D MixDataErrorOpt...
D 10I 0 Inz(0)
D Reserved 8A Inz(*ALLX'00')
D fromCCSID DS LikeDS(QtqCode_T)
D toCCSID DS LikeDS(QtqCode_T)
D iconv_t DS Qualified INZ
D rtn_value 10I 0
D cd 10I 0 Dim(12)
D
D QtqIConvOpen PR ExtProc('QtqIconvOpen')
D LikeDS(iconv_T)
D toCCSID LikeDS(QtqCode_T)
D fromCCSID LikeDS(QtqCode_T)
D hConv DS LikeDS(iconv_T)
D Inz(*LIKEDS)
D**
D iconv PR 10U 0 ExtProc('iconv')
D hConv LikeDS(iconv_t) VALUE
D pInBuff * VALUE
D nInLen * VALUE
D pOutBuff * VALUE
D nOutLen * VALUE
D MyData S 10A Inz('ABCDEFG')
D pData S * Inz
D ppData S * Inz(%addr(pData))
D nInLen S 10I 0
D nOutLen S 10I 0
D iconv_close PR 10I 0 ExtProc('iconv_close')
D hConv LikeDS(iconv_t) VALUE
/free
fromCCSID.CCSID = 273;
toCCSID.CCSID = 1208;
hConv = *ALLX'00';
hConv = QtqIconvOpen(toCCSID:fromCCSID);
/end-free
C eval nInLen = %len(%TrimR(mydata))
C eval nOutLen = %size(mydata)
C eval pData = %addr(myData)
C callp iconv(hConv : ppData : %addr(nInLen):
C ppData:%addr(nOutLen))
C callp iconv_close(hConv)
C MOVE '1' *INLR
Als Ergebnis steht in der hconv ein Return-Wert von -1.
Ich denke mal dass das ein Fehler ist?
Aber was für einer?
Folgendes erhalte ich in der DS-Anzeige von hConv:
Code:
> EVAL hConv
HCONV.RTN_VALUE = -1
HCONV.CD(1) = 1077952576
HCONV.CD(2) = 1077952576
HCONV.CD(3) = 1077952576
HCONV.CD(4) = 0
HCONV.CD(5) = 208
HCONV.CD(6) = 8
HCONV.CD(7) = -2
HCONV.CD(8) = -2147483648
HCONV.CD(9) = 0
HCONV.CD(10) = -978493160
HCONV.CD(11) = 671093600
HCONV.CD(12) = 0
Wenn ich das richtig verstanden habe und iconv sauber gelaufen ist, dann müsste der nInLen anschließend auf 0 stehen richtig?
Habe ich noch etwas übersehen/falsch implementiert?
-
Du kannst nicht 2 mal die selbe Adresse für iconv angeben.
Die Konvertierung würde sonst vollkommen schieflaufen, wenn du von einem 1-Byte Code in einen 2-byte-Code convertierst.
CCSID 1208 ist ein variabler 1-4-Byte-Code. Du musst also als Zielpuffer ein mindest 4-Mal längeres Feld angeben als das Quellfeld (auch wenn du z.zt. kein Chinesisch hast).
Aber aus 4 * "Ü" werden z.B. 8 Bytes in UTF-8 erstellt.
Aber nochmal:
Wenn du für das Encoding (s.o.) in deiner XML-Ausgabe "ISO-8859-1" angibst, so kannst du sorglos in 1252 konvertieren.
-
Hallo Fuerchau,
das mit dem 1252 habe ich verstanden und will ich zum Ende hin dann nochmal testen.
Aber erstmal würde mich interessieren, warum ein -1 als Value kommt.
Ich habe jetzt einen weiteren Pointer aufgenommen und diesen übergeben.
Was mir noch aufgefallen ist, ist das bereits nach dem Qtqiconvopen ein -1 enthalten ist.
Gehört das so?
-
Nein.
Ich habe mich mit diesem API auch noch nicht beschäftigt.
Lieber ist mir das dazu passende OPM-API:
Convert a Graphic Character String (CDRCVRT, QTQCVRT) API
Das ist einfacher und funktioniert auch genauso schnell.
-
Toschie, der Code funktioniert, Du hast nur vergessen, die DS fromCCSID und toCCSID richtig zu initialisieren, sprich, die "Inz(*LIKEDS)"
hast Du sowohl bei fromCCSID und toCCSID vergessen. Wenn Du die beiden einbaust, kriegst Du kein -1 und er übersetzt Dein ABCDEFG auch.
-
 Zitat von Anton Gombkötö
Toschie, der Code funktioniert, Du hast nur vergessen, die DS fromCCSID und toCCSID richtig zu initialisieren, sprich, die "Inz(*LIKEDS)"
hast Du sowohl bei fromCCSID und toCCSID vergessen. Wenn Du die beiden einbaust, kriegst Du kein -1 und er übersetzt Dein ABCDEFG auch.
Das mit dem -1 ist weg!
Vielen Dank dafür.
Allerdings scheint mir die Konvertierung nicht zu klappen.
Gebe ich zum Beispiel anstatt ABCDEF die Werte
ABCÜäFG aus, erhalte ich sowohl mit und ohne iConv die Ausgabe ABCš„FG 
@Fuerchau: Hast du ein gutes/kleines Sample für
Convert a Graphic Character String (CDRCVRT, QTQCVRT) API
Würde mir das Parallal dann auch noch gerne ansehen.
Vielen Dank allen beteiligten und ein schönes Wochenende!
-
Nein, ein Beispiel steht mir im Moment leider nicht zur Verfügung.
Wie kontrollierst du denn die Ausgabe nach iConv() ?
Ein 'Ü' in 1252 entspricht x'DC'.
Wenn du im Debugger den Inhalt Hex vergleichst, weißt du dass die Konvertierung funktioniert.
Prüfst du über das Ziel-System, ist ggf. 1252 nicht korrekt.
Aber nochmal:
Stelle den obigen Header ".... Encoding="ISO-8859-1" ..." ein, damit ein XMLReader die daten korrekt interpretiert.
Durch dein BOM erwartet der Reader ggf. UTF-8 und dann müsstest du halt in 1208 konvertieren.
-
@Fuechau:
Danke und ich habe dem Kunden bereits eine Datei mit iso geschickt zur Validierung.
Diese wird aktuell noch geprüft.
Da ich aber gerne wissen würde ob der Befehl grundsätzlich richtig implementiert wurde (für die Zukunft), hake ich halt nochmal nach.
Also vor dem Durchlauf von
PHP-Code:
/free fromCCSID.CCSID = 0; toCCSID.CCSID = 1208; hConv = *ALLX'00'; hConv = QtqIconvOpen(toCCSID:fromCCSID); /end-free     C eval output = *Blanks C eval nInLen = %len(%TrimR(mydata)) C eval nOutLen = %size(mydata) C eval pData = %addr(myData) C eval ppData = %addr(output) C callp iconv(hConv : pData : %addr(nInLen): C ppData:%addr(nOutLen))
Lautet in RDI der Hexwert von (MyData)
ABCÜäFG -> C1C2C35AC0C6C7404040
Und nach dem Durchlauf:
(MyData)
C1C2C35AC0C6C7404040
Also unverändert.
Der Wert in OUTPUT ist Blank.
Ich hab da bestimmt noch n dummen Fehler -.-
-
Die fromCCSID.CCSID sollte nicht 0 sein.
Da 0 ggf. als "JOB-CCSID" interpretiert wird, sollte der Job nicht auf *HEX (65535) stehen.
Wenn deine DB die CCSID 273 hat bzw. deine Terminals 1141 haben, nimm als fromCCSID eben 273/1141.
-
 Zitat von Fuerchau
Die fromCCSID.CCSID sollte nicht 0 sein.
Da 0 ggf. als "JOB-CCSID" interpretiert wird, sollte der Job nicht auf *HEX (65535) stehen.
Wenn deine DB die CCSID 273 hat bzw. deine Terminals 1141 haben, nimm als fromCCSID eben 273/1141.
Habe ich alles versucht.
Bleibt alles unverändert.
Ich habe gestern Abend noch ein anderes Sample gefunden:
Code:
* Quick & Dirty iconv() Demo
*
*
H DFTACTGRP(*NO) ACTGRP(*NEW)
H BNDDIR('QC2LE')
d iconv_t DSbased(prototype_only)
d return_value10I 0
d cd 10I 0dim(12)
d from DS
d from_CCSID 10I 0
d from_ConvAlt 10I 0inz(0)
d from_SubsAlt 10I 0inz(0)
d from_ShiftAlt10I 0inz(1)
d from_InpLenOp10I 0inz(0)
d from_ErrorOpt10I 0inz(1)
D from_Reserved8Ainz(*ALLx'00')
d to DS
d to_CCSID 10I 0
d to_ConvAlt 10I 0inz(0)
d to_SubsAlt 10I 0inz(0)
d to_ShiftAlt 10I 0inz(1)
d to_InpLenOp 10I 0inz(0)
d to_ErrorOpt 10I 0inz(1)
D to_Reserved 8Ainz(*ALLx'00')
d QtqIconvOpen PRextproc('QtqIconvOpen')
dlike(iconv_t)
d tocode like(to) const
d fromcode like(from) const
d iconv PR10U 0extproc('iconv')
d cd like(iconv_t) value
d inbuf *
d inbytesleft 10U 0
d outbuf *
d outbytesleft10U 0
D iconv_close PR10I 0extproc('iconv_close')
D cd like(iconv_t) value
*
* MI function to get a hex dump of data in memory
* (target will be twice the size of the source)
*
D HexDump PRExtProc('cvthc')
D target 32767Aoptions(*varsize)
D src_bits 32767Aoptions(*varsize) const
D length 10I 0value
D ic dslikeds(iconv_t)
D Data s 12Avarying
D p_Data s *
D DataLen s 10U 0
D HexData s 24A
*
* 1252 = MS Windows, US ASCII
* 0 = special value meaning "current job's CCSID"
*
ceval to_CCSID = 1208
ceval from_CCSID = 273
*
* initialize iconv() API
*
ceval ic = QtqIconvOpen(to: from)
cif ic.return_value = -1
** ... FIXME: handle error ...
cendif
*
* Convert "hello world" to Windows ASCII
*
*
ceval Data = 'ABCÜäFG'
ceval p_Data = %addr(Data) + 2
ceval DataLen = %len(Data)
cif iconv(ic: p_Data: DataLen:
cp_Data: DataLen) = -1
** ... FIXME: handle error ...
cendif
*
* Create hex dump to test conversion
*
ccallp HexDump( HexData
c: Data
c: %size(HexData))
cdsply HexData
*
* call iconv_close() to free up resources when done
*
ccallp iconv_close(ic)
ceval *inlr = *on
Jedoch wandelt mir dieses Ding alles um.
Das Ergebnis von:
'ABCÜäFG' ->
0007C1C2C35AC0C6C70000000000
ist
â{CæCw -> 0007414243C39CC3A60000000000
-
Das API unterstützt keine varying-Felder!
Die Länge der Ein-/Ausgabe wird ja in separaten Feldern übergeben.
Verwende bitte Fixed-Charfelder!
Du kannst es ja am Ergebnis sehen, dass nur die ersten 7 Stellen umgewandelt wurden.
Die x'0007' ist die Längeninformation des Varying-Feldes.
Similar Threads
-
By VolkerGrebner in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 16-02-07, 14:38
-
By vige1000 in forum NEWSboard Linux
Antworten: 4
Letzter Beitrag: 21-12-06, 11:56
-
By Robi in forum IBM i Hauptforum
Antworten: 2
Letzter Beitrag: 14-12-06, 11:12
-
By Weki in forum IBM i Hauptforum
Antworten: 4
Letzter Beitrag: 11-09-06, 13:31
-
By cseitz in forum IBM i Hauptforum
Antworten: 0
Letzter Beitrag: 20-06-06, 14:40
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks