Aller au contenu

%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.