Re: Jeux de caractères, notamment UTF- 8
Jean-Pierre Rosen <[email protected]> Fri, 11 Sep 2020 16:25:06 +0200
| Newsgroups | gmane.comp.lang.ada.france |
|---|---|
| Message-ID | <[email protected]> |
Le 08/09/2020 à 19:34, Thomas De Contes a écrit :
> 1
> quand je faisais des sites web, à un moment donné je me suis penché sur la question du "meilleur" jeu de caractères à utiliser, que ça soit pour :
> - la compatibilité avec le maximum de navigateurs
> - la compatibilité avec mon ordinateur et mes outils d'édition de html
> - le nombre et la pertinence des caractères disponibles, de sorte qu'il y ait besoin de revenir le moins souvent possible sur le jeu de caractères que j'aurai choisi pour cause de caractère manquant, avec toutes les questions que ça implique pour en choisir un autre (et jongler avec plusieurs)
>
> j'ai choisi UTF-8,
> à l'époque sur le 1er point c'etait pas tout à fait le meilleur, par exemple Latin-1 était meilleur,
> mais sur le 3ème il était imbattable ! universel ! tout en étant compatible ascii !
>
> et à en croire le choix majoritaire des "collègues", c'était le bon choix :-)
> (c'était pas le cas dans tous les domaines : par exemple j'ai choisi le xhtml, qui apparemment a été laissé tomber)
Attention, UTF-8 n'est pas un jeu de caractères, mais un encodage. Le
jeu de caractères (le seul qui importe pour ton point 3) est Unicode.
Perso, je colle tout avec des codes HTML ("é"), comme ça il n'y a
pas de problème d'encodage (avec un petit sed, ou emacs) pour
transformer les caractères accentués).
> 2
> utilisation de gnat
>
> j'ai un peu de mal à comprendre comment ça marche :
> https://gcc.gnu.org/onlinedocs/gcc-10.2.0/gnat_ugn/Character-Set-Control.html
>
> par exemple, si je met les options "-gnati5 -gnatWs",
> concrètement, comment gnat va t il lire mon code ?
> avec Cyrillic pour les identifiants et Shift/JIS pour les littéraux de chaines de caractères ?
> et si j'ai bien compris, dans les commentaires, tous les caractères non-ascii sont autorisés tout le temps (sauf NEL) ?
>
> (y a t il autre chose que identifiants / littéraux / commentaires, où on écrit potentiellement comme on veut ?)
-gnati se réfère à la norme 8859, qui définit les jeux de caractères
8bits. Cela suppose donc le source d'entrée n'est PAS en Unicode codé
UTF-8. Du coup, il faut avoir une méthode pour mettre quand même dans le
texte des caractères en dehors du jeu de caractères 8 bits choisi: c'est
le rôle de -gnatW
> 3
> ce que je crois avoir compris, par contre, c'est comment ada et gnat
> envisagent UTF-8 : les auteurs ont déjà fait plusieurs pas en
> direction d'unicode et UTF-8, notamment avec le paquetage
> Ada.Strings.UTF_Encoding (A.4.11), mais ne sont pas encore arrivés au bout
Un programme Ada est en Unicode/ISO10646 (cf. 2.1). On demande aux
compilateurs de reconnaitre les sources encodés en UTF-8. Mais ça, c'est
la représentation du code source du programme, ça n'a rien à voir avec
les chaines manipulées par le programme.
> Ada.Strings.UTF_Encoding.UTF_8_String est d'un basique type
> String,c'est à dire basé sur Standard.Character, c'est à dire avec le
> jeu de caractères Latin-1
Formellement, l'UTF-8 n'est pas une suite de caractères, mais une suite
de valeurs numériques. La décision d'utiliser String est essentiellement
pratique, pour le cas où on lit la première ligne d'un fichier, on
reconnait un BOM, et du coup on réalise que c'est de l'UTF-8. La
définition prudente du RM tient compte de cette ambiguité: "[the string]
is assumed to contain characters whose position values correspond to a
valid encoding sequence" (A.4.11(49/3). Il n'est pas question de jeu de
caractères.
> ça correspond à ce que j'ai testé :
>
> - code source codé en UTF-8
> - gnatmake avec l'option -gnatW8
> - programme avec un littéral qui est transmis directement à GtkAda
>
> - si on met de l'ascii (U+00 - U+7F),
> tout va bien
>
> - si on met des caractères non Latin-1 (> U+FF),
> gnat repond "literal out of range of type Standard.Character"
Oui, il faut au moins un Wide_Character...
>
> - si on met des caractères Latin-1 non-ascii ("upper-half", U+80 - U+FF),
> l'executable repond "Pango-WARNING **: Invalid UTF-8 string passed to pango_layout_set_text()
Si Pango attend de l'UTF-8, il faut lui passer de l'UTF-8. L'UTF-8
utilise les caractères >7F pour son encodage, donc tu ne peux pas mettre
des caractères au hasard
> du coup, si on veut bénéficier du potentiel d'unicode, avec la possibilité d'utiliser n'importe quel caractère, sans avoir besoin de revenir sur aucun réglage le jour où l'envie nous prend (ou le besoin survient),
> on doit utiliser l'option -gnatW8 combinée avec Standard.Wide_Wide_String
>
> ce qui implique :
>
> - quand on n'utilise que de l'ascii (l'immense majorité du temps) ça prend 4 fois plus de mémoire que nécessaire
>
> - ça dois faire 2 conversions inutiles (puisqu'elles sont symétriques) :
> - le compilateur doit convertir l'UTF-8 en Wide_Wide_String
> - le programme doit convertir le Wide_Wide_String en UTF-8, avec Ada.Strings.UTF_Encoding.Wide_Wide_Strings.Encode, pour pouvoir le passer à GtkAda
Exact, mais la première conversion a lieu à la compilation, donc c'est
sans effet à l'exécution. Tu peux utiliser les Wide_String, il y a peu
de choses intéressantes en dehors du plan de base (à part les smileys ;-) )
> 4
> l'idéal, ça serais de pouvoir écrire un programme en UTF-8, y compris des littéraux de chaines de caractères, et que ça soit interprété directement sous la forme Ada.Strings.UTF_Encoding.UTF_8_String, sans aucune conversion
> (par exemple pour qu'on puisse le passer directement à GtkAda)
>
> - est ce que dans les révisions futures, notamment la prochaine, vous continuez à vous rapprocher de ça ?
Pas sûr que ça s'applique, mais il y a une généralisation des litéraux
qui pourrait bien faire ça.
> - y a t il un moyen de faire ça proprement des aujourd'hui ?
> (idéalement quelque chose qui pourrais être accepté dans le code de gnat lui-même :-) bon là je crois que je rêve ;-) )
>
Rien ne t'empêche de faire une constant String tout encodée, mais elle
paraitra bizarre dans l'éditeur...
--
J-P. Rosen
Adalog
2 rue du Docteur Lombard, 92441 Issy-les-Moulineaux CEDEX
Tel: +33 1 45 29 21 52, Fax: +33 1 45 29 25 00
http://www.adalog.fr
_______________________________________________
Ada-france mailing list
[email protected]
https://mail.ada-france.org/cgi-bin/mailman/listinfo/ada-france