Bonjour à tous.
Je rencontre un problème en exploitant l'api iconv en RPGLE.
Elle fonctionne correctement sauf quand elle rencontre un caractère codé sur un octet en ebcdic à convertir en caractère codé sur 2 octets en utf-8.
Ex : pour la donnée à convertir "TEST N°1" j'obtiens en UTF8 "TEST N°".
Dans ce cas, le caractère ° = 70 en hexa ebcidc devient c2b0 e, hexa utf8.
J'ai essayé avec d'autres caractères comme le ¼ et j'obtiens le même résultat.
Je pensais qu"il s'agissait d'un problème de longueur car le résultat de la conversion est poussée dans un fichier IFS.
Mais en débuggant les données en hexa, je me rend compte que la conversion s'effectue correctement j'usqu'au caractère ° uniquement.
Pouvez-vous m'aider à résoudre ce problème ?
Ps : mon code
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73 D/copy IFSEBOOK/QRPGLESRC,IFSIO_H D/copy IFSEBOOK/QRPGLESRC,IFSTEXT_H ** D openIFS PR 10I 0 extproc('open') D path * value options(*string) D oflag 10I 0 value D mode 10U 0 value options(*nopass) D codepage 10U 0 value options(*nopass) * D writeIFS PR 10I 0 extproc('write') D fildes 10I 0 value D buf * value D nbyte 10U 0 value ** API call to close a stream file ** D closeIFS PR 10I 0 extproc('close') D fildes 10I 0 value d QtqIconvOpen PR extproc('QtqIconvOpen') d like(iconv_t) d tocode like(to) const d fromcode like(from) const d iconv PR 10U 0 extproc('iconv') d cd like(iconv_t) value d inbuf * d inbytesleft 10U 0 d outbuf * d outbytesleft 10U 0 D iconv_close PR 10I 0 extproc('iconv_close') D cd like(iconv_t) value D Data s 500A varying D p_Data s * D DataLen s 10U 0 // init conversion CCSID To_CCSID = 1208; From_CCSID = 0; ic = QtqIconvOpen(to: from); If ic.return_value = -1; Pretour = 'E'; Leave; EndIf; <...> // création flux fd = openIFS(%trim(fluxml): O_CREAT+O_WRONLY+O_CODEPAGE: RW*OWNER + RW*GROUP + R: 1208); If fd < 0; Pretour = 'E'; Leave; Endif; <...> Data = %Trim(data); p_Data = %addr(Data) + 2; DataLen = %len(Data); if iconv(ic: p_Data: DataLen: p_Data: DataLen) = -1; pretour = 'E'; *inlr = *on; return; endif; len = %len(%Trim(data)); writeIFS(fd: %addr(data)+2: len); <...>
Partager