%GRAPH
Convertir en graphique
Convertit une chaîne Unicode (UCS-2) en zone graphique DBCS, à deux octets par caractère. Il faut déclarer la conversion dans ctl-opt.
Syntaxe
%GRAPH(expression)
expression- Une zone ou une expression UCS-2 (ou graphique) à convertir. Le résultat prend le CCSID graphique du programme, fixé dans
ctl-opt ccsid(*graph : 300). - Résultat
- Une valeur graphique : deux octets par caractère, de longueur mesurée en caractères.
À quoi ça sert
Les zones graphiques (type graph) servent à stocker des caractères asiatiques sur deux octets dans des fichiers DBCS. La fonction convertit dans ce sens à partir d'une chaîne Unicode, celle de la plupart des données modernes (XML, JSON, pages web).
Exemple 1 : Aller-retour Unicode et graphique
**free
// %GRAPH : convertir de l'Unicode (UCS-2) en donnee graphique (2 octets par caractere).
ctl-opt dftactgrp(*no) actgrp(*new) ccsid(*graph : 300);
dcl-s nomU ucs2(3) inz(u'30E430DE30C0');
dcl-s latinU ucs2(3) inz(u'004400750070');
dcl-s nomG graph(3);
dcl-s latinG graph(3);
dcl-s retour ucs2(3);
dcl-ds octet qualified;
car ucs2(1);
code uns(5) overlay(car);
end-ds;
nomG = %graph(nomU);
snd-msg 'Longueur : ' + %char(%len(nomG)) + ' caracteres, ' + %char(%size(nomG)) + ' octets';
retour = %ucs2(nomG);
snd-msg 'Katakana, aller-retour identique : ' + %char(retour = nomU);
latinG = %graph(latinU);
retour = %ucs2(latinG);
snd-msg 'Latin "Dup", aller-retour identique : ' + %char(retour = latinU);
octet.car = %subst(retour : 1 : 1);
snd-msg 'Code du D apres le retour : ' + %char(octet.code) + ' au lieu de 68';
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Longueur : 3 caracteres, 6 octets
Katakana, aller-retour identique : 1
Latin "Dup", aller-retour identique : 0
Code du D apres le retour : 65533 au lieu de 68
Trois caractères katakana (ヤマダ) donnent une zone graphique de 3 caractères sur 6 octets, et le retour en Unicode redonne la même chaîne (1). Avec des lettres latines Dup, l'aller-retour échoue (0) : le D (code 68) revient sous le code 65533, le caractère de remplacement. La page de codes 300 est une page japonaise : elle ne contient pas les lettres latines ordinaires.
Exemple 2 : Graphique vers caractère
**free
// %GRAPH : une zone graphique ne se convertit pas en caracteres simples.
ctl-opt dftactgrp(*no) actgrp(*new) ccsid(*graph : 300);
dcl-ds pgmsts psds qualified;
typ char(3) pos(40);
num char(4) pos(43);
end-ds;
dcl-s nomU ucs2(3) inz(u'30E430DE30C0');
dcl-s nomG graph(3);
dcl-s texte varchar(20);
nomG = %graph(nomU);
monitor;
texte = %char(nomG);
snd-msg 'Conversion reussie';
on-error *all;
snd-msg 'Graph vers caractere : ' + pgmsts.typ + pgmsts.num;
endmon;
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Graph vers caractere : RNX0451
Une zone graphique ne se convertit pas en texte simple : %CHAR(nomG) s'arrête avec RNX0451 (« conversion du CCSID 300 au CCSID 0 non prise en charge »). Repassez par %UCS2 pour manipuler la chaîne.
Le piège
Sans ctl-opt ccsid(*graph : 300), la fonction ne compile pas (RNF0565, fonction non admise selon le CCSID des valeurs). Seuls certains CCSID sont acceptés : ccsid(*graph : 1200) est refusé (RNF1014).
Autres surprises : les lettres latines ne survivent pas à un aller-retour dans la page 300, et partir d'une zone caractère simple donne l'erreur d'exécution RNX0450. Ne l'utilisez que pour des données réellement DBCS.