Unicode

Introduction

'Unicode' est un terme utilisé pour désigner un jeu de caractères étendu destiné à afficher du texte dans de nombreux langages différents (y compris les langages non latins, avec beaucoup de symboles différents tel que le Japonais, le Coréen etc.). En unicode, chaque symbole a sa place propre, et il n'est pas nécessaire d'avoir une table de caractères par langue. Si une application doit fonctionner dans plusieurs langues, il est fortement recommandé d'activer le mode unicode lors du commencement du développement, car cela limitera les bugs qui pourraient survenir en cas de conversion tardive ascii vers unicode.

Pour simplifier, l'unicode peut être vu comme une très grande table ascii, qui n'a pas 256 caractères mais 65536. Donc, pour stocker un caractère, 2 octets seront nécessaires en mémoire (c'est important de noter cette différence, notamment lors de l'utilisation de pointeurs vers des chaînes de caractères). Le type natif 'caractère' (.c) de PureBasic change de taille automatiquement (de 1 octet à 2 octets) si le mode unicode est activé.

Voici quelques liens pour se faire une meilleure idée de l'unicode (lecture vivement conseillée):

Information générale sur l'unicode (Français)
Information générale sur l'unicode (Anglais)
L'unicode et les BOM

Unicode et Windows

Sous Windows, en mode unicode, PureBasic utilise l'encodage UCS2 qui est le format utilisé de manière interne par l'API, donc aucune conversion n'est nécessaire lorsqu'un fonction est appelée. Si le programme utilise des fonctions API, PureBasic utilisera automatiquement la version unicode de la fonction si elle est disponible (par exemple MessageBox_() pointera vers MessageBoxW() en mode unicode, et vers MessageBoxA() en mode ascii). Il en va de même pour toutes les structures et les constantes API supportées par PureBasic. Ainsi il est possible d'utiliser le même code source API et de le compiler en mode ascii ou unicode sans aucun changement.

Unicode est supporté nativement uniquement sur Windows NT et supérieur (Windows 2000/XP/Vista): un programme unicode ne fonctionnera pas sur Windows 95/98/NT. Il y a une solution qui consiste à utiliser la dll 'unicows' mais elle n'est pas gérée par PureBasic pour l'instant. Si le programme doit fonctionner sur Win 9x, le mieux est de fournir deux versions de l'exécutable: un en mode ascii et l'autre en mode unicode. Comme il faut uniquement spécifier une option de compilation pour passer du mode ascii au mode unicode, ça devrait être aisé.

UTF-8

L'UTF-8 est une autre façon d'encoder une chaîne de caractères unicode. Contrairement à UCS2 qui prend toujours 2 octets par caractère, UTF-8 utilise un encodage variable pour chaque caractère (jusqu'à 4 octets pour représenter un caractère). Le point fort de l'UTF-8 est qu'il ne contient pas de caractère nul lors de son encodage, donc le texte peut être édité facilement. De plus, les caractères ASCII de 1 à 127 sont conservés (ils ne sont pas modifiés lors de l'encodage) ce qui rend le texte à peu près lisible pour les langues latines. Son point faible est le côté variable de ses caractères, ce qui nécessite des routines de gestion de texte plus lentes.

PureBasic utilise l'UTF-8 comme encodage par défaut pour l'écriture et la lecture des chaînes de caractères dans les fichiers, lorsque l'exécutable est en mode unicode (bibliothèques Fichier et Préférence), pour que les fichiers soient complètement indépendants de la plateforme.

Le compilateur du PureBasic gère aussi les fichiers sources ascii et UTF-8 (les fichiers UTF-8 doivent avoir une entête BOM). Les deux types de fichiers peuvent être combinés dans un programme sans problème: un fichier source ASCII peut inclure un fichier source UTF-8 et vice-versa. Lors du développement d'un programme unicode, il est recommandé de mettre l'IDE en mode UTF-8, pour que tous les fichiers sources soient enregistrés en UTF-8. Comme les sources au format UTF-8 peuvent aussi servir à compiler un programme en mode ASCII, il n'est pas nécessaire de changer le format de fichier à chaque changement de mode.