[Tuto] Autoit et UTF-8

Espace contenant des tutoriels divers concernant AutoIt.
Règles du forum
.

Tutoriel "La programmation avec Autoit" : https://openclassrooms.com/fr/courses/1 ... vec-autoit
Répondre
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

[Tuto] Autoit et UTF-8

#1

Message par Iste »

Salutations,

Suite a ce sujet, je me suis dis qu'il serait bon de faire un point sur l'UTF-8 avec autoit.

UTF-8, c'est quoi ?


Vous avez déja entendu parler de UTF-8, ou de ISO 8859-1 ou ISO 8859-15 voir d'unicode. Il s'agit de système d'encodage des textes, je ne m'attarde pas sur les détailles (Wikipédia le fait mieux ;)) mais en gros sachez que :
- ISO 8859-1 ou latin1 permet d'encoder une grande partie des caractères français, ISO 8859-15 corrige un peut le truc avec l'ajout de quelques caractères.
- ISO 10646 est un charset plus large permettant d'encoder presque tout les caractères du monde.
- Unicode reprend tout les caractères de ISO 10646, en les codant de manière plus puissante.
- UTF-8 est une facon de représenter Unicode.
En gros, l'ISO 8859-1 qui est très rependu chez nous, c'était bien, dans le temps ! Maintenant nos machines sont assez puissantes et ont assez de mémoire pour que l'UTF-8 ne mange rien ! De plus, on est de plus souvent amené a utiliser des caractères étrangers, comme le japonais ou certains noms propres. Unicode est donc presque indispensable pour un logiciel de ce nom !

La position d'Autoit a ce sujet


http://www.autoitscript.fr/autoit3/docs ... nicode.htm
On nous recommande chaudement UTF-8 ! Innutile donc de se poser la question de savoir si Autoit le supportera :)
Attardez vous quand meme sur cette page pour les cas spécifiques (windows < 2000, Send, regexp, console (quoi que, ca on véra :p))

Scite4Autoit et UTF-8


Aussi méga trop bien que semble UTF-8 apres tout ce que je viens de vous raconter, il s'avère que Scite utilise par défaut l'encodage ISO 8859-1... Au passage, d'expérience personnel, j'ai déjà eu de gros bugs dans des programmes pour avoir utilisé Scite pour des modifs rapides, a cause de l'encodage.
Pour changer l'encodage de la page courrante, vous pouvez faire "Fichier -> Encodage -> UTF8"
Pour changer l'encodage par défaut, il suffit de faire "Options > Open Global option file", de trouver la ligne qui parle d'unicode (CTRL+F) et de changer les ligne comme suit :

Code : Tout sélectionner

# Internationalisation
# Japanese input code page 932 and ShiftJIS character set 128
#code.page=932
#character.set=128
# Unicode
code.page=65001 [color=#40BF00]<--- on retire le #de cette ligne, [/color]
#code.page=0    [color=#40BF00]<--- et on en ajoute un là ![/color]
#character.set=204
Apres ca, votre Scite sera parfaitement calibré pour l'UTF-8 ! Attention toute foi, les code enregistrés e n ISO auront des petits bugs sur les caractères spéciaux !

Compiler en avec Unicode


C'est bien bô d'avoir un script en UTF-8, mais si on le compile sans instructions spécifique depuis Scite, il sera converti en ISO ! arf..
La solution est allors de passer le paramètre /unicode au compilateur, ce qui force la compilation en ligne de commande...
Je n'ai pas trouvé de directive pour AutoitWarper la dessus !
Sinon, sachez que le clic droit -> compiler est plus malin, et saura utiliser Unicode si il le faut !

ConsoleWrite() et Unicode


ConsoleWrite() c'est vachement sympa pour communiquer avec le programme qui appel notre scripte, mais "Characters are converted to ANSI before being written." Ha ben merci ! C'est sympa !...
En fait, la console ne supporte que l'ANSI, donc on peut comprendre la conversion. Mais dans le cadre ou l'on utilise le flux de sorti pour envoyer des infos, c'est vraiment pas cool !
Une solution, un peu bricolée mais qui marche, on converti notre chaine en binaire avec le flag 4 pour bien convertir l'UTF-8, puis on décode du binaire vers String avec le flag 1, pour dire "c'est du ANSI promis juré !"
Du coup, on se retrouve avec notre chaine parfaitement écrite, mais autoit pense qu'il s'agit d'ANSI :) donc il l'envoi sans chercher a convertir !
exemple

Code : Tout sélectionner

ConsoleWrite(StringToBinary(BinaryToString("Ma phrase en Japonais !! ♥", 1), 4))
Conclusion


Vu comment c'est la galère de passer en UTF-8, je vous conseil de laisser tomber si vous en avez pas besoin. Apres tout, j'ai passé 3ans avant que cela ne me bloque !
Mais si vous êtes joueurs, ou simplement curieux, ou bien obligé, alors j'espère qu'avec tout ca vous pourrez vous en sortir !
Signez ici
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [Tuto] Autoit et UTF-8

#2

Message par Tlem »

Intéressent, mais avec un petit peut plus de détails, quel est la différence entre les principaux encodage. ;)
Différences principales entre ANSI, UNICODE, UTF-8 et ISO.

Pour la directive de Scite4AutoIt, ne serait-ce pas :

Code : Tout sélectionner

#AutoIt3Wrapper_UseAnsi=N
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [Tuto] Autoit et UTF-8

#3

Message par Iste »

Pour

Code : Tout sélectionner

 #AutoIt3Wrapper_UseAnsi=n
Qand je regarde dans autoit3warpper, tout semple aller dans ce sens, toute foi, que je le rajoute ou pas, mes scripts se font quand même convertir avant compilation ! erf
Sinon en effet, je n'ai pas parlé d'Ansi dans ma parti sur les encodages. Simplement car je suis déja assez perdu comme ca moi meme ^^'
De ce que j'ai compris, Ansi désigne de l'ASCII et donc serait encore moins puissant que l'iso 8859, mais d'un autre coté, j'enten aussi parler de Ansi pour parler de l'iso 8859...

Bref, sur ce point, je compte bien sur vous pour venir me compléter ! ;)

Le but principal de mon post était surtout fonctionnel, que meme sans comprendre l'on puisse s'en sortir. Car perso, j'men suis sorti sans trop comprendre x)
Signez ici
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2272
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : En ligne

Re: [Tuto] Autoit et UTF-8

#4

Message par jchd »

Je me sens un peu obligé de mettre mon petit grain de sel.

Déjà, quelques précisions concernant les jeux de caractères.

ANSI, dit tout seul et dans un contexte Windows, n'est pas un, mais un ensemble de jeux de caractère ! Ce qui conditionne le choix du jeu effectivement employé, c'est le CodePage système et/ou utilisateur. Anisi, une chaîne ANSI pour une machine réglée au Japon emploiera une page de code ANSI complètement distincte de nos bécanes française de France.
Un moyen simple de faire un tour dans ce qui se fait est l'application charmap.exe (Table de caractères), de cocher "Affichage avancé" et de regarder le jeu dispo avec une fonte comme Arial Unicode MS et en sélectionnant différents jeux de caractères (Unicode, Windows Baltique, ou autre Windows coréen). Les jeux qui ne sont pas DOS quelquechose ou Unicode sont tous des versions d'ANSI. Vous remarquerez au passage que les jeux occidentaux ANSI ne comprennent que 256 positions tandis que les jeux ANSI asiatiques sont bien plus vastes. Cela est dû au fait qu'ils emploient une représentation sur plusieurs octets (BIG5 ou autre, il y a de très nombreuses variantes) car ils ont besoin de représenter beancoup plus de 256 idéogrammes. Les 32 premières positions sont toujours les mêmes caractères de contrôle (non représentables, sauf TAB et consort).

ASCII est le jeu limité aux 128 premères positions de tout jeu ANSI.

Le gros avantage d'Unicode est qu'il regroupe peu à peu (au fil des révisions/extensions) tous les "caractères" étant ou ayant été utilisés par l'humanité et pour lesquels les spécialiste du consortium Unicode s'accordent sur une définition claire.
Unicode permet aussi beaucoup de subtilité, par exemple en permettant de dissocier les accentuations des caractères qu'elles concernent.

Unicode ne fait "que" définir des "codepoints" et leurs caractéristiques, mais ne se préoccupe pas d'encodage. Les normes d'encodage des "codepoints" Unicode sont (pour ne parler que des normes actuelles) les variantes de UTF : UTF-7 (utilisé un temps pour le mail, mais heureusement tombé en désuétude), UTF-8, UTF-16LE, UTF-16BE, UTF-32LE et UTF-16BE.

Les *LE et *BE sont les versions Little Endian et Big Endian, selon l'ordonnancement des unités de code (octets ou mots).

Pour ce qui nous préoccupe, voici l'encodage UTF-8 et UTF-16 :

Code : Tout sélectionner

** Notes on UTF-8:
**
**   Byte-0    Byte-1    Byte-2    Byte-3    Value
**  0xxxxxxx                                 00000000 00000000 0xxxxxxx
**  110yyyyy  10xxxxxx                       00000000 00000yyy yyxxxxxx
**  1110zzzz  10yyyyyy  10xxxxxx             00000000 zzzzyyyy yyxxxxxx
**  11110uuu  10uuzzzz  10yyyyyy  10xxxxxx   000uuuuu zzzzyyyy yyxxxxxx
**
** Notes on UTF-16:  (with wwww+1==uuuuu)
**
**      Word-0               Word-1          Value
**  110110ww wwzzzzyy   110111yy yyxxxxxx    000uuuuu zzzzyyyy yyxxxxxx
**  zzzzyyyy yyxxxxxx                        00000000 zzzzyyyy yyxxxxxx
**
** BOM or Byte Order Mark:
**     0xff 0xfe   little-endian utf-16 follows
**     0xfe 0xff   big-endian utf-16 follows
 
Le BOM est une suite d'octets placés en tête d'un ficher texte (source ou autre) pour indiquer aux programmes qui le lisent comment interpréter les octets ou mots. Sous Scite, il est impératif de sauvegarder ses sources UTF _avec_ BOM si on veut préserver leur sens correct. C'est probablement pour cette raison que différents posteurs plus haut on parlé de fichiers source mal interprétés par le compilo. Perso, je n'emploie que de l'UTF-8 + BOM, car j'ai besoin d'Unicode dans mes sources. Le seul hiatus est que les wrappers AutoIt ne fonctionnent pas avec UTF et on obtient ça :
! ***************************************************************************************************
! * Input file is UTF8 encoded, Au3Check/Tidy/Obfuscator do no support UNICODE and will be skipped.*
! ***************************************************************************************************
Sinon, il n'y a pas d'autre soucis.

En ce qui concerne la console Scite, elle accepte parfaitement une sortie UTF-8. Voici ce que j'utilise partout :

Code : Tout sélectionner

Func _ConsoleWrite($sString)
    Local $aResult = DllCall("kernel32.dll", "int", "WideCharToMultiByte", "uint", 65001, "dword", 0, "wstr", $sString, "int", -1, _
                                "ptr", 0, "int", 0, "ptr", 0, "ptr", 0)
    If @error Then Return SetError(1, @error, 0)
    Local $tText = DllStructCreate("char[" & $aResult[0] & "]")
    $aResult = DllCall("Kernel32.dll", "int", "WideCharToMultiByte", "uint", 65001, "dword", 0, "wstr", $sString, "int", -1, _
                            "ptr", DllStructGetPtr($tText), "int", $aResult[0], "ptr", 0, "ptr", 0)
    If @error Then Return SetError(2, @error, 0)
    ConsoleWrite(DllStructGetData($tText, 1))
EndFunc
 
Avec ça, votre console Scite peut afficher tout caractère Unicode. Par contre, aucune fonte ne permet à elle seule d'afficher tout Unicode, ni même le plan zéro. La fonte standard la plus "vaste" est Arial Unicode MS.

Et AutoIt dans tout ça ? Et bien accrochez-vous, AutoIt n'emploie pas Unicode mais un sous-ensemble dénommé UCS-2. Les caractères du plan zéro d'Unicode y sont représents par un seul mot de 16 bits (il n'existe pas de surrogate en UCS-2) et il n'est donc pas possible de codifier des caractères des plans supérieurs. En pratique et sauf si vous avez besoin de codifier des hiéroglyphes égyptiens ou des symboles de musique byzantine ancestrale, vous ne risquez guère d'avoir besoin de plus.

La console de cmd.exe est ANSI (et utilise la page de code correspondant à vos réglages de localisation) par défaut. Mais on peut parfaitement lui faire afficher de l'Unicode : il suffit de changer la page de code pour 65001.

Quelques sites :
http://www.joelonsoftware.com/articles/Unicode.html (tutoriel)
http://rishida.net/scripts/uniview/ (mon préféré et de très loin le plus utile, voir aussi les utilitaires qu'Ishida offre en retournant sur la page d'accueil)
http://www.unicode.org/
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [Tuto] Autoit et UTF-8

#5

Message par Iste »

Merci beaucoup jchd, c'est tout juste ce qu'il me fallait ^^
Signez ici
Répondre