A partir de la version 17 de WINDEV, WEBDEV et WINDEV Mobile, les projets peuvent être configurés de façon à travailler en mémoire avec des chaînes ANSI, ou des chaînes UNICODE. Cela s'applique aux projets :
  • WINDEV pour les applications sous Windows, les webservices,
  • WEBDEV pour les sites Web, les pages AWP retournant des données à d'autres applications à la façon d'un webservice,
  • WINDEV Mobile pour les applications mobiles sous Windows Mobile, Android et iOS.
Le réglage est accessible par le menu "Projet ... Configuration de projet ... Description de la configuration courante" :

 

 

Historiquement, tous les projets existants utilisent des chaînes ANSI en exécution. Se pose donc la question du passage éventuel des projets en chaînes UNICODE. De façon générale, pour les projets multilingues, si toutes les langues utilisées dans l'IHM, et les données, utilisent l'alphabet latin, le codage des chaînes en UNICODE n'est pas nécessaire. Donc à l'inverse, dès que le projet va mêler différentes langues aux alphabets différents, là en revanche l'utilisation de chaînes UNICODE sera à privilégier. Il n'est en aucun cas nécessaire de modifier systématiquement le type des chaînes dans toutes les applications existantes.

 

Lorsque dans un projet le remplacement des chaînes ANSI par des chaînes UNICODE s'impose, un assistant est disponible afin d'évaluer précisément les effets sur l'application. Il est accessible par le menu "Projet ... Audit d'édition ... Assistant de passage à l'UNICODE".

 

Au sein d'un même projet, que les chaînes en exécution soient en ANSI ou en UNICODE, cela reste transparent pour le développement. La vigilance s'impose en revanche, dès qu'il devient nécessaire de partager des données, entre différents projets. Par exemple entre un site Web configuré pour utiliser des chaînes ANSI, et une application mobile configurée pour utiliser des chaînes UNICODE. Voici un exemple concret pour bien illustrer le principe ...

 

Un site Web créé avec WEBDEV dispose d'une page configurée en mode AWP afin de renvoyer des informations à des applications mobiles créées avec WINDEV Mobile. Le projet WEBDEV utilise des chaînes ANSI en exécution, l'envoi d'information est effectué à l'aide de la fonction ChaineAffiche (extrêmement pratique pour échanger des données à la façon d'un webservice) :
ChaîneAffiche("Exemple Blog")

 

Une application WINDEV Mobile est déployée sous ANDROID, en utilisant des chaînes UNICODE pour le projet, elle interroge la page du site WEBDEV afin de récupérer les données renvoyées :
sAdressePageWEBDEV est une chaîne = "http://www.monsite.com/page-webdev.awp"
HTTPRequête(sAdressePageWEBDEV)
Info(HTTPDonneRésultat(httpRésultat))

 

Dans cet exemple, à l'exécution depuis un périphérique Android le résultat obtenu via la requête HTTP ne sera pas "Exemple Blog", mais une chaîne illisible :

 

 

En effet, côté WEBDEV de part la configuration du projet, la page retourne une chaîne ANSI. Côté WINDEV Mobile la fonction HTTPRequete récupère donc un buffer de données ANSI. Mais comme le projet utilise des chaînes UNICODE, la fonction Info est en attente de données UNICODE, donc un affichage direct du buffer ANSI n'est pas envisageable. Si le projet WINDEV Mobile avait lui aussi été configuré afin d'utiliser des chaînes ANSI en exécution, là en revanche l'affichage du résultat serait immédiat. Le bon code de récupération de l'information ANSI depuis le projet WINDEV Mobile UNICODE, serait donc pour cet exemple :
sANSI est une chaîneANSI
HTTPRequête(sAdressePageWEBDEV)
sANSI = HTTPDonneRésultat(httpRésultat)
Info(sANSI)

 

ou :

 

Info(AnsiVersUnicode(HTTPDonneRésultat(httpRésultat)))

 



Cet exemple a été choisi car il revient régulièrement dans des demandes reçues par le Support Technique Gratuit. Pour des échanges d'informations les webservices sont à privilégier, l'aspect codage/décodage des données étant ainsi géré entièrement par le WLangage. Mais de part l'existant il est cependant fréquent d'avoir cette solution de page AWP retournant des données, réutilisées par des projets plus récents donc ayant des chaînes UNICODE en exécution.

Mise à jour 30/8/2021
Le calcul du Hash d'une chaîne de caractères est également source d'erreur. Le "piège" est par exemple d'avoir le code :

HashChaîne ( HA_SHA_512, "Chaîne sur laquelle sera effectuée le calcul")

Le buffer obtenu sera identique uniquement si le code est exécuté dans des projets qui gèrent des chaînes d'un même type en exécution. Mais si un projet a les chaînes ANSI, et l'autre en UNICODE, les buffers obtenus seront différents. Si un même Hash doit être fait sur différentes plateformes (pour un codage, décodage, authentification ou hashage...), passer la valeur via une chaîne forçant le type est recommandé pour lever toute ambiguité :

sPourCalculHash est une chaîne ANSI = "Chaîne sur laquelle sera effectuée le calcul"
HashChaîne ( HA_SHA_512, sPourCalculHash )

< Retour