Modernisation Oracle Forms

Comprendre et résoudre les problèmes NLS d'Oracle Forms déployé sur le Web

S'APPLIQUE À : Oracle Forms

Oracle Forms - Version 6.0.8.8.0 et ultérieures
Les informations de ce document s'appliquent à toutes les plateformes.
Pertinence vérifiée le 01-JUN-2010

OBJECTIF : Oracle Forms, paramètres NLS

Expliquer d'abord comment Oracle Forms déployé sur le Web gère les paramètres NLS, puis donner des conseils et astuces de dépannage lorsque des problèmes ou des comportements inattendus surviennent, par exemple lorsque des caractères non anglais ne sont pas correctement enregistrés dans la base de données ou relus depuis celle-ci.

PORTÉE

Cet article concerne spécifiquement :

  • Oracle 9iAS Rel 1 Forms Services (Forms 6i (6.0.8))
  • Oracle 9iAS Rel 2 Forms Services (Forms 9i (9.0.2))
  • Oracle 9iDS Rel 2 (Forms 9i (9.0.2))
  • Oracle Application Server 10g (9.0.4) Forms Services (Forms 10g (9.0.4))
  • Oracle Developer Suite 10g (9.0.4) (Forms 10g (9.0.4))
  • Oracle Application Server 10g (10.1.2) Forms Services (Forms 10g (10.1.2))
  • Oracle Developer Suite 10g (10.1.2) (Forms 10g (10.1.2))
  • Oracle Fusion Middleware 11gR1 (11.1.1) Forms Services (Forms 11g (11.1.1))

Public visé : ingénieurs de soutien, consultants, administrateurs système, DBA et développeurs

DÉTAILS : gestion des caractères NLS

Comprendre les bases du NLS

Terminologie et concepts de la gestion des caractères NLS

  • Lettre : élément d'un alphabet. Un caractère peut être une lettre, un chiffre, un signe de ponctuation ou tout autre symbole imprimable.
  • Écriture : famille de caractères utilisés dans un groupe de langues ou d'alphabets apparentés, par exemple l'écriture latine ou l'écriture arabe.
  • Jeu de caractères : liste de caractères, généralement celle qui est nécessaire pour écrire dans une langue donnée. Chaque caractère est accompagné d'une description et d'un identifiant numérique, le point de code. Un point de code est unique au sein d'un jeu de caractères. L'encodage des caractères est la manière dont les points de code sont codés et transmis dans un flux binaire. À proprement parler, le jeu de caractères est une entité abstraite, mais dans l'usage courant, y compris dans ce cours, “jeu de caractères” sous-entend l'encodage utilisé.
  • Glyphe : représentation visuelle du caractère. Plusieurs caractères peuvent parfois être affichés en un seul glyphe, par exemple les lettres accentuées ou les lettres composées.
  • Police : ensemble de glyphes, accompagné d'informations d'affichage supplémentaires comme la taille, l'italique, le gras et le style (serif : avec empattements ; sans-serif : sans empattements ; par exemple Times, Arial)

Les ordinateurs et l'encodage des caractères

Les systèmes informatiques ne traitent que des nombres binaires (des 1 et des 0) et utilisent un schéma d'encodage qui permet de manipuler les caractères alphabétiques sous forme de nombres binaires. Chacun des caractères utilisés dans la communication humaine - lettres de l'alphabet, chiffres et signes de ponctuation - est représenté par une valeur binaire. Ce schéma d'encodage est ensuite utilisé par le clavier, l'écran et l'imprimante qui interagissent avec l'ordinateur. Lorsque vous appuyez sur une touche de caractère, le clavier génère la valeur binaire définie par le schéma d'encodage. Lorsqu'un écran (ou une imprimante) reçoit une valeur binaire représentant un caractère, il affiche (ou imprime) le caractère défini par le schéma d'encodage. Les schémas d'encodage comprennent aussi des codes de contrôle, par exemple le saut de ligne, {newline normal}, qui servent à contrôler la mise en forme des données.

Exemple : le schéma d'encodage d'un clavier, d'un ordinateur et d'un écran donnés pourrait utiliser 0100001 pour représenter la “lettre latine majuscule A”. Pour un autre clavier, ordinateur et écran, le schéma d'encodage pourrait être 00011 (Baudot ; notez qu'il n'utilise que 5 bits) ou 11000001 (EBCDIC). Notez qu'un jeu de caractères n'est pas un encodage de caractères. Dans le code Baudot, la valeur binaire 00011 peut signifier A ou - (signe moins), selon l'état de la touche de majuscule. Dans le code ASCII, relativement simple, le jeu de caractères et l'encodage ont une relation biunivoque, et la distinction entre jeu de caractères et encodage n'est pas évidente. Unicode a un seul jeu de caractères, mais plusieurs encodages différents (UTF-8, UTF-16LE, UTF-16BE)

Polices et jeux de caractères

Le système d'exploitation utilise une police pour convertir une valeur numérique en une 'impression' graphique à l'écran. La police WingDings de Windows est un exemple de police dans laquelle un 'A' ne s'affiche PAS comme un 'A' à l'écran. Pour le système d'exploitation, la valeur numérique représente un 'A'. Avec WingDings, le caractère n'apparaît PAS comme un 'A', mais en coulisse c'est bien un 'A', et il sera enregistré (ou utilisé) comme un 'A'. Il est possible qu'une police n'affiche pas TOUS les symboles définis dans un jeu de caractères / une page de codes, car elle ne comporte pas forcément de représentation graphique pour chacun d'eux. C'est pourquoi des carrés noirs apparaissent parfois à l'écran lorsqu'on change de police.
Sous Windows, l'outil 'Character Map' permet de voir tous les symboles définis dans une police.

Types de jeux de caractères

7 bits, p. ex. ASCII – peut définir 128 symboles / caractères
8 bits, p. ex. ROMAN8 – peut définir 256 symboles / caractères
Unicode, p. ex. UTF8 – jeu de caractères multioctet capable de définir plus d'un million de caractères

Pourquoi différents jeux de caractères ?

Historiquement, les fournisseurs ont défini des 'jeux' différents pour leur matériel et leurs logiciels, surtout parce qu'il n'existait pas de normes officielles. De nouveaux jeux de caractères ont été définis pour prendre en charge de nouvelles langues. Par exemple, avec un jeu de caractères 8 bits, le nombre de symboles pouvant être définis est limité. Il existe donc des jeux différents pour les différentes langues écrites.

Fonctionnalités NLS d'Oracle

Prise en charge des langues
Prise en charge des territoires
Prise en charge des jeux de caractères
Tri linguistique
Prise en charge des messages
Formats de date et d'heure
Formats numériques
Formats monétaires

Qu'est-ce que le jeu de caractères de la base de données ?

Le jeu de caractères de la base de données est défini à la création de la base et stocké dans la table du dictionnaire de données sys.props$. Il détermine quels caractères peuvent être stockés dans la base de données. Il sert aussi à déterminer le jeu de caractères utilisé pour les identifiants d'objets, les variables PL/SQL et les structures.

Qu'est-ce qu'un jeu de caractères ‘client’ ?

Cette notion ne s'applique qu'aux applications client-serveur traditionnelles, comme l'explique :

Note:158577.1 NLS_LANG Explained (How does Client-Server Character Conversion Work?)

Remarque importante : l'architecture de déploiement Web gère le NLS de telle sorte qu'il n'est plus nécessaire de tenir compte du jeu de caractères ou de l'encodage du poste client qui héberge l'applet Forms, ni de celui du serveur intermédiaire qui héberge Forms Runtime. Pour plus de détails, consultez les sections "Oracle Forms et le processus de conversion NLS :..".

Qu'est-ce que NLS_LANG ?

NLS_LANG permet d'indiquer à Oracle le jeu de caractères du système d'exploitation client, afin qu'Oracle puisse effectuer (au besoin) la conversion du jeu de caractères du client vers celui de la base de données. NLS_LANG se compose de trois parties :

[Language]_[Territory].[Characterset] p. ex. POLISH_POLAND.EE8MSWIN1250

Que contrôle la partie langue de NLS_LANG ?

  • la langue des messages ainsi que des noms des jours et des mois
  • l'ordre de tri par défaut
  • Elle définit aussi les valeurs par défaut du territoire et du jeu de caractères : si la langue est indiquée, les deux autres arguments peuvent donc être omis.

Que contrôle la partie territoire de NLS_LANG ?

  • le format de date par défaut
  • le séparateur décimal et le séparateur de milliers
  • le symbole de la devise locale
  • le premier jour de la semaine

Remarque : LANGUAGE et TERRITORY n'ont rien à voir avec la capacité à *stocker* des caractères dans une base de données. JAPANESE_JAPAN.WE8MSWIN1252 ne stockera *pas* le japonais, car WE8MSWIN1252 ne connaît pas les caractères japonais. AMERICAN_AMERICA.JA16SJIS le fera, car JA16SJIS prend en charge / connaît les caractères japonais.

Qu'est-ce que la bibliothèque d'exécution NLS d'Oracle (NLSRTL) ?

  • Une bibliothèque, composant commun à Forms et au SGBDR
  • Elle traite les chaînes dans divers jeux de caractères
  • Elle effectue les conversions entre jeux de caractères
  • Elle compare les chaînes selon des règles linguistiques
  • Elle fournit aux logiciels Oracle les conventions de format des dates, des nombres et des montants pour les paramètres régionaux pris en charge
  • Elle met en œuvre des calendriers autres que le calendrier grégorien
  • Elle lit les chaînes d'interface traduites dans les fichiers de messages

Oracle Forms et la conversion NLS : vers la base de données

Poste client, p. ex. MS Windows + navigateur + Oracle Jinitiator / plug-in JDK + applet Forms

  • L'utilisateur saisit un caractère dans un composant léger, p. ex. un champ texte
  • Le champ texte reçoit le point de code (ANSI) du système d'exploitation client
  • La JVM (machine virtuelle Java) convertit en interne le point de code en UTF-16 (à l'aide de l'API Win32 MultiByteToWideChar). Ce point de code est stocké dans la mémoire du client.
  • Avec le plug-in Sun JDK 1.4.2, les composants légers reçoivent directement le point de code UTF-16 du système d'exploitation. Aucune conversion interne en UTF-16 n'a lieu

Poste client ---> Niveau intermédiaire ( p. ex. OracleAS 10g Forms Services)

  • L'applet Forms convertit le flux UTF-16 en UTF-8 (CESU-8)
  • puis l'envoie au niveau intermédiaire (à l'aide d'une routine de conversion CharToByte)
  • Les données qui circulent sur le réseau entre le client et le niveau intermédiaire sont toujours en UTF-8 (et non en UTF-16).
  • Sur le niveau intermédiaire, le flux UTF-8 est converti dans le jeu de caractères indiqué par le paramètre NLS_LANG de Forms (à l'aide de NLSRTL)

Poste client ---> Niveau intermédiaire ---> Base de données (p. ex. Oracle Server 10g)

  • Forms Runtime, sur le niveau intermédiaire, effectue des appels OCI pour stocker les données dans la base de données
  • Si le jeu de caractères NLS de Forms et celui de la base de données ne sont pas les mêmes, une conversion des caractères est effectuée
  • La conversion vers le jeu de caractères de la base de données est effectuée dans la couche OCI d'Oracle Server avant le stockage des données.

Oracle Forms et la conversion NLS : depuis la base de données

Base de données (p. ex. Oracle Server 10g)

  • Les données sont renvoyées à Forms Runtime, sur le niveau intermédiaire, par la couche OCI

Base de données -----> Niveau intermédiaire ( p. ex. OracleAS 10g Forms Services)

  • Forms Runtime convertit en UTF-8 les données encodées dans le jeu de caractères indiqué par NLS_LANG (à l'aide de NLSRTL)
  • Elles sont ensuite envoyées à l'applet Forms sur le client.

Base de données -----> Niveau intermédiaire -----> Poste client, p. ex. MS Windows + navigateur + Oracle Jinitiator / plug-in JDK + applet Forms

  • Le flux UTF-8 est ensuite converti en UTF-16 (à l'aide d'une routine de conversion ByteToChar) et stocké en mémoire.
  • Pour l'affichage, la JVM (machine virtuelle Java) accède aux informations de police à l'aide du point de code UTF-16
  • La JVM assure elle-même le rendu des caractères, sans passer par l'API de MS Windows. Aucune autre conversion n'a donc lieu

Mettre en place un test NLS de base avec Oracle Forms

La base de données

Sous MS Windows, l'outil ‘Database Configuration Assistant’ d'Oracle RDBMS 10g permet de créer rapidement une base de données simple configurée avec le jeu de caractères cible. Le jeu de caractères de la base doit contenir et prendre en charge les caractères que l'on souhaite enregistrer et afficher au moyen de l'application Oracle Forms (et, bien sûr, de toute autre application comme SQL*Plus), p. ex.

Start – Programs - Oracle – [Nom du serveur Oracle] – Configuration and Migration Tools – Database Configuration Assistant.

Les jeux de caractères se configurent à l'étape 10 sur 12, dans l'onglet Characters Sets. Par exemple, choisissez le jeu de caractères UTF8

Forms Builder : créer et générer une forme

Si vous utilisez Forms Builder sous MS Windows, définissez NLS_LANG dans le registre, sous :

(6.0.8 - 9.0.4) HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/Homex

(10.1.2 et plus) HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/KEY_x

C'est nécessaire pour que les caractères s'affichent lors de la conception dans Forms, et pour que les caractères des textes fixes (boilerplate) soient correctement intégrés au module Forms lors de la génération.

À noter : si la forme est développée avec Forms Builder sur une machine MS Windows puis portée sur une plateforme Unix, NLS_LANG doit être correctement défini lors de la génération du fichier fmx sur la plateforme Unix. Par exemple, modifiez $ORACLE_HOME\bin\f90genm.sh et insérez-y le paramètre NLS_LANG approprié.

Lorsque vous développez une forme dans Builder, choisissez une police qui prend en charge les caractères requis. Par exemple, utilisez l'utilitaire Character Map de MS Windows pour trouver la bonne police : Start - Programs – Accessories – System Tools. Choisissez un caractère chinois et copiez-collez-le dans l'éditeur de mise en page de Forms Builder, c.-à-d. dans un texte fixe (boilerplate) ou une étiquette. Notez que si la police choisie dans l'éditeur de mise en page de Forms Builder diffère de celle de l'utilitaire Character Map, le copier-coller depuis Character Map vers l'éditeur de mise en page de Forms Builder ne fonctionnera pas.

Exécuter la forme

Pour que les caractères s'affichent correctement lors de l'exécution de Forms, NLS_LANG doit aussi être défini dans le fichier .env, p. ex. %ORACLE_HOME%\forms90\server\default.env. Si le paramètre NLS_LANG indiqué n'est pas approprié, les textes fixes peuvent apparaître sous forme de symboles ou de caractères illisibles, et les caractères renvoyés par la base de données peuvent apparaître sous forme de points d'interrogation.

Que se passe-t-il si NLS_LANG n'est pas correctement défini dans le registre ou lors de la génération Forms ?

  • Dans Forms Builder et à l'exécution, les caractères saisis comme textes fixes dans l'éditeur de mise en page peuvent apparaître sous forme de points d'interrogation inversés.
  • Les caractères renvoyés comme données par la base de données devraient continuer à s'afficher correctement (à condition que NLS_LANG soit défini dans le fichier default.env)

Que se passe-t-il si seuls les aspects linguistiques de NLS_LANG sont modifiés ?

  • L'affichage des caractères reste inchangé
  • Seul le format des dates, des valeurs décimales et des montants change

Le jeu de caractères NLS défini pour Forms doit-il correspondre à celui de la base de données Oracle Server ?

La partie jeu de caractères de la variable d'environnement NLS_LANG de Forms n'a pas à correspondre au jeu de caractères de la base de données, mais elle ne peut pas en être un surensemble. Par exemple, lorsque le jeu de caractères de la base de données est WE8MSWIN1252, le jeu de caractères de Forms ne doit pas être UTF8.

Lorsque le jeu de caractères de Forms diffère de celui de la base de données et que NLS_LENGTH_SEMANTICS n'est pas défini à CHAR, un problème d'expansion des données peut survenir (jeux de caractères multioctets seulement). Exemple : lorsque le jeu de caractères de Forms est JA16SJIS (japonais) et que celui de la base de données est UTF8, il sera possible de saisir 5 caractères japonais dans un champ texte Forms dont la longueur maximale est de 10. Ces 5 caractères japonais occuperont toutefois 15 octets et ne tiendront pas dans une colonne de base de données déclarée VARCHAR2(10). Pour en savoir plus sur la sémantique des caractères, consultez :

Note:305259.1 Executing a Query Causes FRM-40831 in Forms

Viewlet / démo

Pour télécharger un viewlet de 5 minutes qui présente un scénario de test NLS de base avec Oracle Forms, cliquez ici. Pour lire le viewlet, extrayez le contenu du fichier zip et double-cliquez sur le fichier 'forms_and_nls_viewlet_swf.html'