Site:  Cours VB.net  
  2.10 Annexe

Les caractères: 

Codage:Ascii Unicode UTF, polices de caractère .

 

Chaque caractère possède un code caractère numérique. Il peut être d'une longueur de 7, 8, ou 16 bits.

A ce code correspond un glyphe qui est une représentation graphique du caractère, le glyphe fait partie d'une font et d'une police.

Exemple:

En ASCII (codage ASCII ),le caractère 97  correspondant au glyphe 'a' dans la font Courier New.  

Voyons:

A- Codage des caractères.

    Codage sur 7 bits Ascii.

    Codage sur 8 bits

    Codage sur 16 bits ou plus Unicode et UTF

B- Représentation graphique des caractères.

    Glyphe, Font, Police.

   BitMap, True Type, Open Type.

    Police proportionnelle.

C- Et sur le Web et dans VB? 

 

 

A- Codage des caractères

Codage sur 7 bits: Ascii:

L' American Standard Code for Information Interchange (ASCII) est en vigueur depuis les années 1980.

C'est un ancien codage des caractères sur 7 bits (Ascii pur) au départ correspondant au clavier américain sans accentués.

Il comporte 128 caractères.  

Les codes 0 à 31 correspondent aux caractères de contrôle.(Non imprimable: 9 = tabulation, 13= retour chariot)

Les codes 32 à 64 correspondent aux opérateurs et aux chiffres.( 32=' ', 43='+', 49='1')

Les codes 65 à 90 représentent les majuscules.(65='A')

Les codes 91 à 122 représentent les minuscules.(91='a')

 

Il a été normalisé sous le nom d'ISO 646.

 

Codage sur 8 bits:

On est ensuite passé sur 8 bits (un octet) pour l'ascii étendu contenant les accentués. On peut donc coder 256 (0 à 255) caractères.

En codage 8 bits, pour que les caractères apparaissent correctement, il faut utiliser la bonne page de code (CharSet), le bon jeu de caractères.

Le codage 8 bits a été normalisé sous le nom d'ISO 8859.

L'ISO 8859 a plusieurs cartes de caractères, ou jeu de caractères, ou page de codes:

-La norme ISO 8859-1, dont le nom complet est ISO/CEI 8859-1 est appelée Latin-1 ou alphabet latin numéro 1. elle permet de représenter la plupart des langues de l'Europe occidentale: l'albanais, l'allemand, l'anglais, le catalan, le danois, l'espagnol, le féroïen, le finnois, le français, le galicien, l'irlandais, l'islandais, l'italien, le néerlandais, le norvégien, le portugais et le suédois.

  0 1 2 3 4 5 6 7 8 9 A B C D E F
0 caractères  non imprimables
1
2  ! " # $ % & ' ( ) * + , - . /
3 0 1 2 3 4 5 6 7 8 9  :  ; < = >  ?
4 @ A B C D E F G H I J K L M N O
5 P Q R S T U V W X Y Z [ \ ] ^ _
6 ` a b c d e f g h i j k l m n o
7 p q r s t u v w x y z { | } ~
8 caractères non imprimables
9
A ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª «  ¬ ­ ® ¯
B ° ± ² ³ ´ µ ¸ ¹ º  » ¼ ½ ¾ ¿
C À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï
D Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß
E à á â ã ä å æ ç è é ê ë ì í î ï
F ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ

 

-Le jeu  ISO 8859-2 est appelé  Latin 2  et permet de représenter les langues slaves et d'Europe centrale qui utilisent l'alphabet latin. l'allemand, le croate, le hongrois, le polonais, le roumain, le slovaque, le slovène et le tchèque.

-Le jeu de caractère  ISO 8859-3 est utilisé pour l'espéranto, le galicien, le maltais et le turc.

...

-Le jeu ISO-8859-15 ou Latin 9 est une légère modification du Latin 1 qui ajoute le symbole monétaire de l'Euro, ainsi que quelques lettres accentuées qui manquaient pour le français et le finnois. Il est destiné aux mêmes langues que le Latin-1.

-Le jeu ISO-8859-1 (remarquez le tiret supplémentaire) a été validé par l'IANA (Internet Assigned Numbers Authority), pour une utilisation sur Internet, c'est un sur-ensemble de l'ISO/CEI 8859-1.Ce jeu  attribue des caractères de contrôle aux valeurs 00 à 1F, 7F, et 80 à 9F. Pour compliquer un peu les choses, le nom du jeu a souvent de nombres synonymes et équivalents (Exemple: ISO-8859-1= ISO_8859-1:1987, ISO_8859-1, ISO-8859-1,  iso-ir-100, csISOLatin1, latin1,  IBM819, CP819)

 

Windows-1252 ou CP1252 est un jeu de caractères disponible sur  Microsoft Windows aux États-Unis, et dans certains pays de l'Union européenne.

Windows-1252 est une extension de l' ISO  8859-1 : il en diffère par l'utilisation de caractères imprimables, plutôt que des caractères de contrôle, dans la plage 80-9F. Windows appelle ce jeux l' ANSI,  mais il peut y avoir un autre nom, comme par exemple CP1252.

MacRoman ou Mac OS ROMAN est un jeu utilisé sur les ordinateurs Mac qui diffère légèrement de jeu Latin. voir différences

Pour mémoire il existait le jeu OEM sur les premiers PC.

En codage 8 bits, pour que les caractères apparaissent correctement, il faut utiliser la bonne page de code (CharSet). Il n'y a qu'une page de code par texte.

 

Codage sur 16 bits ou plus: UCS, Unicode:

On a ensuite crée des codes de 16 bits ou plus.

- L'UCS « jeu de caractères codés universel » (Universal Coded Character Set, souvent abrégé en UCS)

Existe depuis l981.Il a été normalisé sous le nom d'ISO/CEI 10646.

Il y a l'UCS-2 qui contient 65535 codes :PMB ou Plan Multilingue de Base codé sur 2 octets contenant les 'principaux' caractères.

et l'UCS-4 codé sur 4 octets contenant tous les caractères.

- L'Unicode. ou 'Unicode Standard' depuis 1991 crée par le Consortium Unicode qui collabore avec l'Iso.

Il a été normalisé sous le nom d'ISO/CEI 10646-1:1993  puis ISO/CEI 10646-1:2000.

Contient les mêmes caractères que l'UCS mais avec quelques règles en plus.

USC-4 = Unicode en simplifiant!!

L’Unicode dans sa version la plus récente (4.1.0) contient 245 000 codes différents, représentant 245000 caractères, symboles, etc.

Il contient tous les caractères d'usage courant dans les langues principales du monde. Il permet de mettre plusieurs langues dans une seule page, ce que ne permet pas le codage 8 bits.

Les premiers 128 codes (0–127) Unicode correspondent aux lettres et aux symboles du clavier américain standard. Ce sont les mêmes que ceux définis par le jeu de caractères ASCII (ancien codage sur un octet). Les 128 codes suivants (128–255) représentent les caractères spéciaux, tels que les lettres de l'alphabet latin, les accents, les symboles monétaires et les fractions. Les codes restants sont utilisés pour des symboles, y compris les caractères textuels mondiaux, les signes diacritiques, ainsi que les symboles mathématiques et techniques.

Voici les 255 premiers

Le petit carré indique un caractère non imprimable (non affichable), certains caractères sont des caractères de contrôle comme le numéro 9 qui correspondant à tabulation, le numéro 13 qui correspond au retour à la ligne..

La valeur d’un caractère Unicode est appelée point de code. Ainsi le caractère 'f' a un point de code égal à 102.

L'Unicode regroupe ainsi la quasi-totalité des alphabets existants (arabe, arménien, cyrillique, grec, hébreu, latin, ...) et est compatible avec le code ASCII.

 

Encoding:

Pour écrire de l'Unicode dans un fichier (web, html, xml..), cela serait trop simple de mettre 2 ou 4 octets pour chaque caractère. Aussi pour des problèmes de compatibilité entre plate formes les codes Unicode sont transformées en UTF.

UTF = UCS Transformation Format.Format de transformation de l'UCS (Unicode)  

Il existe plusieurs méthodes de transformation l'UTF-8, l' UTF-16, l' UTF-32 qui sont des manières d'écrire de l'Unicode dans un fichier.

 

UTF-8

Taille variable: 1 à 4 octets, plus le nombre est grand, plus il y a d'octets.

Le premier octet indique le nombre d'octet utilisé.

Les caractères de numéro 0 à 127 sont codés sur un octet dont le bit de poids fort est toujours nul.

0xxxxxxx 1 octet codant 7 bits maximum

'A'= 65 en Unicode    = 01000001 en UTF-8  soit 1 octet.

On remarque que dans ce cas Ascii= UTF-8

Les caractères de numéro supérieur à 127 sont codés sur plusieurs octets. Dans ce cas, les bits de poids fort du premier octet forment une suite de 1 de longueur égale au nombre d'octets utilisés pour coder le caractère, les octets suivants ayant 10 comme bits de poids fort.

110xxxxx 10xxxxxx 2 octets codant 8 à 11 bits
1110xxxx 10xxxxxx 10xxxxxx 3 octets codant 12 à 16 bits
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 4 octets codant 17 à 21 bits

Les autres bits (notés 'x' ) codent le nombre.

Exemple

€= 8364= 11100010 10000010 10101100

Il est utilisé sur Unix et le WEB.

il est économique en terme  d'octet car il permet de stocker la majorité des caractères sur un seul octet ( chez nous!!). Pour les caractères dont le point de code a une forte valeur valeurs, l’UTF-8 se chargera de déterminer s’il est nécessaire d’utiliser 1, 2, 3 ou 4 octets pour représenter sa valeur.

 

UTF-16

Taille fixe: 2 ou 4 octets

Il existe l'UTF-16LE et l'UTF-16BE

ils ont la même taille.(Accès rapide au caractère de position x)

L’UTF-16 est utile lorsque la place en mémoire n’est pas un facteur très important. Il facilite la manipulation de textes car le processeur sait qu’il doit analyser les deux premiers octets dans la plupart des cas (parfois 4).

Il est utilisé en Java et dans les API Windows pour la manipulation des chaînes.

 

UTF-32

Taille fixe: 4 octets?

Mais peu économique en mémoire, il gaspille des octets.

Tous les caractères de la terre y sont, ils ont la même taille.(Accès rapide au caractère de position x)

Gourmant en mémoire, peu utilisé.

 

B- Représentation graphique des caractères: Glyphe, Font, Police:

Un glyphe est une représentation graphique (un dessin) d'un signe typographique, autrement dit d'un caractère (glyphe de caractère) ou d'un accent (glyphe d'accent).

Une fonte de caractères, est un ensemble de glyphes, c'est-à-dire de représentations visuelles de caractères d'une même famille, de même style, corps et graisse.

La place d'un glyphe dans une fonte est déterminée par le codage des caractères dans la fonte. Ainsi, dans une fonte encodée en ASCII  le glyphe du caractère « a » se trouvera en 97e position.

 Une police  regroupe tous les corps et graisses d'une même famille.

Le glyphe présente le dessin, alors que le caractère( son code en informatique) représente le sens.

'A, A, A' sont 3 glyphes  en fonte Courier New, Arial et Comic sans MS du même caractère A majuscule (le caractère) de code 97.

En informatique on utilise les caractères (leur code) pour stocker du texte en mémoire, les glyphes contenus dans les polices pour imprimer ou afficher ces caractères.

 

Police BitMap, 'True Type', 'Open Type'.

Avant les années 1990 il y avait des polices au format BitMap (image matricielle). Elle ne sont plus utilisées par VB.Net.

Depuis 1980 existe True Type®, un format de police multiplateforme vectorielle, développé  par Apple et vendu ensuite à Microsoft.

(concurrent du format Type1 de PostScript d'Adobe)

On utilise depuis 2001 OpenType® qui est un nouveau format de police multiplateforme vectorielle, développé conjointement par Adobe et Microsoft. Adobe propose plusieurs milliers de polices OpenType.

Les deux principaux atouts du format OpenType résident dans sa compatibilité multiplateforme (un seul et même fichier de polices exploitable sur les postes de travail Macintosh et Windows) et sa prise en charge de jeux de caractères et de fonctions de présentation très étendus, qui offrent de meilleures capacités linguistiques et un contrôle typographique évolué.

Une police Open  Type est basée sur le numéro de caractères Unicode et peut contenir jusqu'à 65000 glyphes.

Le format OpenType est une extension du format TrueType SFNT qui gère également les données des polices Adobe® PostScript® et des fonctions typographiques inédites. 

Les noms de fichier des polices OpenType contenant des données PostScript possèdent l'extension .otf, tandis que les polices OpenType de type TrueType portent l'extension .ttf.

 

Notion de police proportionnelle.

Il existe des fonts proportionnelles, comme l'Arial, où les différents caractères n'ont pas la même largeur (le i est plus étroit que le P)c'est plus joli.

 Par contre dans les fonts non proportionnelles, comme le 'Courier New', tous les caractères ont même largeur. C'est parfois plus pratique quand on veut afficher des lignes qui concorder sur le plan alignement vertical (et qu'on ne veut pas utiliser les tabulations).

 

En Arial

Philippe Pier:

Philippe Wolf:

 

En Courier new

Philippe Pier:

Philippe Wolf:

 

C- Et sur le Web et dans VB?

Sur le Web:

Un document contient le nom du type de caractères utilisés dans le document: le type d'UTF (codage en 16 bits) ou le nom de la table de caractère (une seule) associée à ce document (codage 8 bits). 

 

Pour un document HTML une balise indique que le document utilise une table des caractères .(Caractères codé sur 1 octet, c'est de l'ascii étendu dans cet exemple)

<meta http-equiv="content-Type" content="text/html; charset=iso-8859-1" />  

ou

<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">

S'il n'y a pas de charset spécifié, c'est la table de caractère du système d'exploitation qui est utilisée. Si elle ne correspond pas à celle du document l'affichage est incohérent. 

Le problème est aussi (si on utilise un codage 8 bits) l'impossibilité de mélanger dans un même document des alphabets qui ne sont pas définis par la même table. Par exemple le français et l'hébreu.

La solution est de passer à Unicode.

 

Pour un mail:

Content-Type: text/plain; charset=ISO-8859-1

ou

Content-Type: text/plain; charset="UTF-8"

Pour un fichier XML:

<?xml version="1.0" encoding="utf-8"?>


En VB:

Les variables string sont stockées sous la forme de séquences de  16 bits (2 octets) non signés dont les valeurs sont comprises entre 0 et 65 535. Chaque nombre de 16 bis  représente le point de code (son numéro et non l'UTF) du caractère Unicode.

Les variables Char sont stockées sous la forme d'un mot de  16 bits (2 octets).

Dim monUnicode As Short = Convert.ToInt16 ("B"c) ' le code Unicode de B est 66.

 

En Net, il existe des fonctions d’encodage et de décodage à bas niveau sur les points de code (byte) et les caractères (char), on peut ainsi transformer une chaîne de Latin-1 en UTF-8, par exemple.

Fonctions d’encodage :

GetBytes() Convertit une chaîne ou un caractère en un tableau de byte dans le charset choisi

 

Comment obtenir un tableau de Bytes contenant le code ascii d'un texte?

Dim  ascii As System.Text.Encoding = System.Text.Encoding.ASCII

Dim MyString As String= "mon texte"      

Dim  MesByte() As Byte = ascii.GetBytes( MyString )

(les caractères non gérés en ascii sont transformés en " ? ", portant la valeur numérique 63.)

Fonctions de décodage :

GetChars() Convertit un tableau de byte en un tableau de char

Pour afficher ces caractères, on utilise des fontes.

 

L'Unicode est donc un codage de caractères sur 16 bits qui contient tous les caractères d'usage courant dans les langues principales du monde.