Jeux de caractères
Sommaire
Remonter à Permettre au code de l'application de fonctionner pour différentes régions
Les anciennes versions (Windows 95/98/Me) des éditions Windows Europe occidentale (notamment, Anglais, Allemand et Français) utilisent le jeu de caractères ANSI Latin-1. Toutefois, les autres éditions de ces versions de Windows (pré-Windows NT) utilisent des jeux de caractères différents. Ainsi, la version japonaise de Windows 95 utilise le jeu de caractères Shift-JIS, qui représente les caractères japonais avec des codes de caractères sur plusieurs octets.
Depuis Windows NT, toutes les versions de Windows utilisent Unicode avec l'encodage UTF-16. Dans Delphi, les caractères encodés UTF-16 sont représentés sous la forme de caractères étendus.
Il y a, en général, trois types de jeux de caractères :
Nous vous conseillons vivement d'utiliser Unicode dans vos applications, mais de nombreuses applications ou fichiers de données dépendent toujours des anciennes pages de codes.
Caractères mono-octets
Dans un jeu de caractères mono-octets, chaque caractère est représenté par une valeur numérique sur un seul octet. Les jeux de caractères mono-octets utilisent des schémas d'encodage de caractères qui mappent chaque caractère sur une valeur numérique (ou point de code), qui est représentée sur un octet (8 bits). Une page de code est un mappage spécifique (schéma d'encodage) de caractères d'un jeu de caractères en points de code.
Dans Delphi, les caractères mono-octets peuvent être représentés par le type AnsiChar.
Les jeux de caractères mono-octets (ou pages de codes) étaient utilisées par les anciennes versions de Windows (pré-Windows NT). Par exemple, le jeu de caractères ANSI Latin-1 (page de code 1252) est le jeu de caractères mono-octets des anciennes éditions Windows Europe occidentale. ANSI est l'acronyme de American National Standards Institute.
Les caractères numérotés de 32 à 127 (7 bits inférieurs) sont les mêmes pour chaque jeu de caractères mono-octets et forment le jeu 7 bits appelé ASCII. ASCII est l'acronyme de American Standard Code for Information Interchange.
Les pages de codes Windows, couramment appelées pages de codes ANSI, sont des pages de codes mono-octets pour lesquelles les valeurs non-ASCII représentent les caractères internationaux. Les caractères d'étendue non-ASCII (numérotés de 128 à 255) sont appelés caractères étendus et varient d'une page de code à une autre. Le jeu de caractères étendus détermine les langues que la page de code peut prendre en charge. Ces pages de codes ANSI sont utilisées nativement dans les anciennes versions de Windows et sont toujours disponibles sur Windows NT et toute version supérieure.
Les pages de code OEM (Original Equipment Manufacturer) sont des pages de codes pour lesquelles les valeurs non-ASCII représentent les caractères de ponctuation et de dessin de lignes. Ces pages de codes étaient utilisées à l'origine pour MS-DOS et sont toujours utilisées en tant que pages de codes par défaut pour les applications console. Les pages de codes OEM sont aussi utilisées pour les noms de fichiers non-étendus dans les anciens systèmes de fichiers FAT12, FAT16 et FAT32. En revanche, le système de fichiers NTFS stocke les noms de fichiers en Unicode.
Votre application peut effectuer la conversion entre les pages de codes Windows et OEM en utilisant les fonctions de la bibliothèque d'exécution standard,CharToOem et CharToOemBuf. Toutefois, l'utilisation de ces fonctions présente un risque de perte de données car les caractères qui peuvent être représentés par correspondance des pages de codes Windows et OEM ne correspondent pas exactement.
Dans les éditions Windows Europe occidentale, la page de code OEM habituelle est 437. Elle se distingue de la page de code 1252 (ANSI Latin-1). Pour les autres paramètres régionaux Windows, notamment Windows Extrême-Orient, les pages de codes OEM sont égales aux pages de codes ANSI.
Caractères multi-octets
Les jeux de caractères idéographiques utilisés en Asie ne peuvent pas utiliser le simple mappage 1:1 entre les caractères de la langue et les caractères de type AnsiChar sur un seul octet. Ces langues ont trop de caractères à représenter avec les caractères mono-octets.
Une approche de travail avec les jeux de caractères idéographiques consiste à utiliser un schéma d'encodage de caractères qui mappe chaque caractère sur une valeur numérique (ou point de code) qui dépasse un octet. De tels caractères sont désignés par le terme caractères multi-octets. Les jeux de caractères multi-octets fournissent un moyen d'encoder les caractères en dehors de l'étendue ANSI standard.
Dans un jeu de caractères multi-octets, certains caractères sont représentés par un octet et d’autres par plusieurs octets (2, 3 et 4 octets).
De nombreux systèmes d'encodage de jeux de caractères multi-octets ont été conçus. Par exemple, le jeu de caractères Shift-JIS (page de code 932) est un encodage de caractères pour le japonais. Dans Shift-JIS, les caractères sont représentés par des points de code sur un ou deux octets. Une chaîne de tels caractères est une chaîne mono-octet avec des caractères d'encodage à largeur variable.
Le jeu de caractères multi-octets, ou MBCS, est un terme utilisé pour décrire les pages de codes qui sont encodées en chaînes mono-octets. De tels encodages ont typiquement des caractères mono-octets qui sont fournis pour la compatibilité descendante. Le premier octet d'un caractère multi-octet est appelé l'octet de poids fort. En général, les 128 premiers caractères d'un jeu de caractères multi-octets sont mappés sur les caractères ASCII 7 bits, et tout octet dont la valeur ordinale est supérieure à 127 est l'octet de poids fort d'un caractère multi-octet. Par conséquent, l'interprétation de chaque octet d'une chaîne avec un encodage multi-octet, qui contient des séquences de deux ou de plusieurs octets, dépend d'un état de conversion déterminé par les octets précédents de la séquence de caractères. Ainsi, la seule façon de savoir si un octet particulier d'une chaîne représente un caractère mono-octet ou fait partie d’un caractère multi-octet consiste à lire la chaîne, en commençant au début, en la décomposant en caractères de deux ou plusieurs octets quand un octet de poids fort d'une valeur supérieure à 127 est rencontré.
Lors de l'écriture de code pour les pays asiatiques, vous devez traiter toutes les manipulations de chaînes avec des fonctions capables de décomposer les chaînes en caractères multi-octets. Pour ces raisons, vous ne pouvez pas traiter les chaînes de caractères multi-octets comme vous traitez les chaînes de caractères mono-octets. Vous devez utiliser un type de chaîne approprié pour les données de caractères multi-octets, tel que le type AnsiString. Les unités AnsiStrings et SysUtils fournissent de telles fonctions.
Les unités AnsiStrings et SysUtils fournissent des fonctions pour gérer la manipulation des chaînes et décomposer les chaînes en caractères multi-octets :
- AnsiStrings, comme la fonction System.AnsiStrings.AnsiCompareStr par exemple
- SysUtils, comme la fonction System.SysUtils.AnsiStrComp par exemple
N'oubliez pas que la longueur de telles chaînes en octets ne correspond pas nécessairement à la longueur des chaînes en caractères. Faites attention à ne pas tronquer les chaînes en coupant en deux un caractère multi-octet. Ne passez pas des caractères multi-octets en tant que paramètre à une fonction ou une procédure, puisque la taille d'un caractère multi-octet n'est pas connue directement. A la place, passez toujours un pointeur sur un caractère ou une chaîne.
Les jeux de caractères multi-octets, en particulier les jeux de caractères sur deux octets (DBCS), étaient fréquemment utilisés pour les langues asiatiques dans les anciens systèmes d'exploitation Windows (pré-Windows NT).
Caractères étendus - Unicode
Les jeux de caractères idéographiques peuvent aussi être représentés dans Unicode. Unicode est constitué de deux fonctionnalités :
- Le jeu de caractères universel fournit un répertoire de plus de 100 000 caractères (points de code).
- Les schémas d'encodage UTF (Unicode Transformation Format). UTF est un encodage de caractères à longueur variable pour Unicode. UTF est capable d'encoder le répertoire de caractères Unicode entier. Unicode peut être implémenté par différents encodages de caractères. Les encodages les plus utilisés sont UTF-8 et UTF-16.
Depuis Windows NT, toutes les versions de Windows sont construites en partant de zéro en utilisant Unicode. Cela signifie que toutes les fonctions principales de Windows, telles que la création des fenêtres, l'affichage du texte, les manipulations des chaînes, et ainsi de suite, nécessitent des chaînes Unicode. Si vous appelez une fonction principale de Windows en lui passant une chaîne ANSI (une chaîne de caractères mono-octets), la fonction convertit d'abord la chaîne en Unicode, puis passe la chaîne Unicode au système d'exploitation. Toutes ces conversions sont transparentes pour vous.
Le standard Unicode décrit un système de représentation des caractères utilisés dans tous les systèmes d'écriture du monde. Le jeu de caractères universel de Unicode peut représenter un espace de code de 1 114 112 caractères ou points de code. Selon l'encodage, les caractères Unicode peuvent être encodés en 1, 2, 3 ou 4 octets. Les systèmes d'encodage UTF (Unicode Transformation Format) sont des représentations de caractères équivalentes et sont facilement converties d'un système à un autre :
- UTF-8 utilise de un à quatre octets par point de code. Il utilise 1 octet pour tous les caractères ASCII et jusqu'à 4 octets pour les autres caractères.
- UTF-32 représente chaque caractère avec quatre octets.
- UTF-16 utilise deux ou quatre octets. Les caractères du BMP (Basic Multilingual Plane) qui contiennent la plupart des caractères mondiaux à usage courant peuvent être représentés sur deux octets (16 bits). Pour les caractères des autres plans, l'encodage UTF-16 conduira à une paire de mots de 16 bits, appelés ensemble une paire de substitution. Les 256 premiers caractères Unicode sont mappés sur le jeu de caractères ANSI.
Nous vous recommandons d'utiliser Unicode dans vos applications.
Le système d'exploitation Windows prend en charge UTF-16 (qui mappe chaque caractère en une séquence de valeurs numériques de 16 bits). Dans Delphi, les chaînes de caractères Unicode peuvent être représentées avec les types UnicodeString et WideString.
- Le type WideString représente une chaîne d'éléments caractère à deux octets. De tels caractères 16 bits sont désignés par le terme caractères étendus. Un WideChar est un élément à deux octets, et un PWideChar est un pointeur sur une chaîne, terminée par le caractère null, d'éléments caractère à deux octets. Le type de caractère WideString est essentiellement le même qu'un BSTR Windows. Par conséquent, WideString doit être utilisé dans les applications COM. Un WideString contient typiquement des caractères encodés en UTF-16. Puisqu'un point de code peut être représenté par 2 ou 4 octets, le nombre d'éléments à 2 octets d'un WideString n'est pas nécessairement le nombre de caractères de la chaîne.
- Le type UnicodeString représente les chaînes de caractères Unicode. Le type UnicodeString utilise le comptage de références.
Bien que le type WideString soit adapté aux applications COM, WideString n'utilise pas le comptage de références. UnicodeString est plus souple et efficace dans les autres types d'applications. En outre, plus de fonctions sont disponibles pour gérer les types UnicodeString que WideString, ainsi UnicodeString est généralement préféré.
Le type AnsiString est utilisé pour représenter des chaînes de caractères mono-octets et peut être utilisé pour MBCS. AnsiString n'est pas utilisé pour Unicode. Le terme MBCS n'est pas utilisé pour faire référence à Unicode.