Caractères unicode manquant…

Guigui
2013-08-20
2013-09-19
  • THEVENOT Guy
    THEVENOT Guy
    2013-09-18

    Hello Guigui,

    Quelques petits rappels, concernant UNICODE et les encodages. Si tu es pressé, va, tout de suite, au point C),à la fin de cet article !


    A) L'UCS ( Universal Character Set ), défini par la norme ISO 10646, est un ensemble contigu de "code-points" compris ente 0x0 et 0x10FFFF, soit 1114112 code-points, divisé en 17 plans de 65536 code-points chacun. Le plan principal, appelé, BMP ( Basic Multilingual Plane ) correspond aux code-points compris entre 0x0 et 0xFFFF.

    UNICODE est la norme qui gère cet espace de code-points. C'est un standard, qui ajoute des règles telles la collation, l'algorithme bi-directionnel, les scripts d'écriture de droite à gauche, comme avec l'arabe ou l'hébreu, etc...

    UNICODE attache aussi certaines propriétés à chaque caractère, permettant de les grouper par familles. ( caractères numériques, de ponctuation, monétaires, ou d'une langue donnée etc... )

    Enfin, UNICODE a partitionné l'espace des code-points en plans, subdivisés en blocs et a défini différentes zones :

    • Certains code-points sont assignables, ou non assignables, à des caractères.

    • Certains code-points sont *réservés pour le mécanisme des "surrogate pairs", pour l'encodage UTF-16.

    • Certains code-poins sont définis comme NON-caractères ( et le resteront dans le futur ! )

    • Certains code-points sont affectés à un usage privé, utilisables pour usage personnel.

    Pour toutes ces raisons, le nombre total de code-points valides n'est que de 1111998.

    Si on ôte les zones à usage privé, le nombre de code-points, que le consortium UNICODE peut affecter à des caractères prédéfinis, afin de représenter l'ensemble des caractères des différents langages, est finalement de 974530.

    Bien entendu, beaucoup de code-points ne sont pas encore assignés à un caractère, même dans la version UNICODE 6.2, qui est la plus récente, mais ils restent disponibles pour une affectation future.

    Sur ces 974530 code-points assignables, seuls 57054 code-points assignables appartiennent au Plan 0 ( entre 0x0 et 0xFFFF )

    Dans le Plan 0, la plus grande partie des codes-points valides ont, à présent, été assignés à des caractères. Par exemple, MA police de caractères Arial Unicode MS ( Version 1.0.1 ) permet de représenter 50377 caractères du Plan 0. C'est, je pense, la plus complète que je connaisse.


    B) Maintenant, il nous faut aborder la notion d'encodage.

    Un encodage peut être vu comme la manière de stocker les valeurs des code-points, associés à des caractères, dont la représentation, sur écran ou papier, se fera par l'intermédiaire d'un certaine police de caractères.

    Avant de disposer d'UNICODE, la plupart des encodages se faisaient simplement, avec 1 seul octet, permettant de coder 256 code-points uniquement ( de 0x0 à 0xFF ). Il était donc nécessaire d'avoir plusieurs jeux de caractères, un ou plusieurs pour chaque famille de langues. ( Par exemple, Windows-1252 Occidental ou Windows-1253 Grec, correspondant à l'encodage générique ANSI, ou les différents jeux de caractères, tels OEM 850, ISO 8859-1 etc..., proposés par Notepad++ )

    UNICODE permettant la représentation de TOUS les caractères existants, de nouveaux encodages, permettant de stocker l'ensemble de ces code-points, ont du été créés. Les plus connus sont :

    • L'encodage UTF-16, NON utilisé par Notepad++, qui permet de stocker l'ensemble des code-points entre 0x0 et 0x10FFFF, avec 2 octets.

    • Les encodages UCS-2 Big Endian et UCS-2 Little Endian, proposés par Notepad++, qui permettent de stocker, sous 2 octets également, l'ensemble des code-points entre 0x0 et 0xFFFF, UNIQUEMENT. Aussi, les caractères, avec code-points > 0xFFFF, du SMP ( Supplementary Multilingual Plane ) ne pourront PAS être codés, avec ces encodages.

    • L'encodage UTF-8 sans BOM et UTF-8, proposés par Notepad++, qui permettent cependant, et HEUREUSEMENT, de stocker TOUS les code-points entre 0x0 et 0x10FFFF, sans restriction, en utilisant 1, 2, 3 ou 4 octets, selon la valeur du code-point.


    C) Donc, et c'est le point sur lequel j'insiste, si tu NE peux PAS voir, dans Notepad++, l'ensemble des caractères du bloc "Miscellaneous Symbols" ( avec code-point dans l'intervalle 0x2600 et 0x26FF ), c'est à cause de l'une des raisons suivantes ( ou peut être des 3 ! )

    • Ta police de caractères actuelle, utilisé par le style "Default Style" de Notepad++ ne le permet pas.

    • Ton fichier n'est pas encodé en UTF-8, UTF-8 sans BOM, UCS-2 Big Endian ou UCS-2 Little Endian.

    • Le contenu de ton fichier NE représente PAS le codage UTF-8 des caractères du bloc 0x2600 - 0x26FF.

    Personnellement, je penche pour la 1ère raison, à savoir la police de caractères.

    En tout cas, Notepad++ n'est PAS en cause car il peut, grâce à UTF-8, afficher ABSOLUMENT TOUS les caractères UNICODE, à condition de disposer d'une police de caractères appropriée. J'ai personnellement afficher, dans N++, pour test, les 48 caractères Osmanya, du Plan 1 UNICODE, avec code-point allant de 0x10480 à 0x104AF, avec une police ad-hoc !

    Quant à la gestion des tables de caractères et la création de nouveaux caractères dans l'UCS, c'est du seul ressort du Consortium UNICODE !

    Revenons à ton problème. Pour mémoire, chaque caractère, avec code-point entre 0x2600 et 0x026FF, est codé, avec l'encodage UTF-8 ou UTF-8 sans BOM, avec 3 octets, le premier étant toujours 0xE2, le second variant entre 0x98 et 0x9B et le troisième entre 0x80 et 0xBF ( soit E2 98 80, E2 98 81,.... E2 98 BF, E2 99 80....E2 99 BF, E2 9A 80....E2 9A BF, E2 9B 80....E2 9B BF )

    J'ai donc fabriqué, pour vérification, un tel fichier et j'espère que tu verras, sur les deux images ci-jointes, les différences d'affichage, concernant le bloc UNICODE "Symboles divers", entre la police par défaut Courrier New ( version 2.90 sur mon système ) qui affiche seulement 11 de ces caractères alors que la police Arial Unicode MS ( v1.0.1 ) affiche correctement 106 caractères sur les 256 caractères du bloc "Miscellaneous Symbols". C'est pas parfait, mais tout de même mieux !

    Bien sûr, comme la police Arial Unicode MS est une police à espacement proportionnel, j'ai du ajouter des espaces, un peu partout, pour retrouver les 16 colonnes alignées !

    Consulte la liste complète des caractères, du bloc "Symboles divers", entre 0x2600 et 0x26FF, à l'adresse suivante :

    http://www.unicode.org/charts/PDF/Unicode-6.0/U60-2600.pdf


    J'ai été un peu long, mais il y a plein de notions à assimiler. Et encore, je n'ai fait qu'effleurer le sujet !

    J'espère avoir, au moins, un peu, éclairer ta lanterne !

    Amitiés,

    guy038

    P.S. : Voici quelques liens, la plupart en anglais ( pour plus de précision ! ), à consulter.

    Tu peux certainement l'équivalent français sur Wikipédia !

    http://en.wikipedia.org/wiki/UTF-16
    http://en.wikipedia.org/wiki/UTF-8
    http://www.i18nguy.com/unicode/codepages.html
    http://en.wikipedia.org/wiki/Byte_order_mark
    http://en.wikipedia.org/wiki/Unicode
    http://www.unicode.org/charts/charindex.html
    http://www.unicode.org/charts/
    http://en.wikipedia.org/wiki/Basic_Multilingual_Plane#Basic_Multilingual_Plane
    http://en.wikibooks.org/wiki/Unicode/Character_reference
    http://en.wikipedia.org/wiki/Code_page

    et cet article, en français, orienté langage ADA, mais vraiment très instructif ! Et puis, n'est-elle pas mignonne cette petite danseuse !

    http://bulleforum.net/decodeur-encodeur-unicode-en-ada-t4295.html

     
    Last edit: THEVENOT Guy 2013-09-18
  • waoouh voilà une réponse claire et documentée. Merci d'avoir pris le temps de la rédiger. Je vais regarder tout ça à tête reposée et, enfin, comprendre quelque chose à Unicode

    Cordialement