Je suis sous W16 avec Delphi 6 PE.
Je suis en train d'approfondir l'usage de l'Unicode qui n'est pas nativement supporté par Delphi 6 PE.
Néanmoins, certaines fonctions d'aide sont disponibles, telles que UTF8Decode (dans System).
A première vue, c'est impeccable... Mais à y regarder de plus près, il y a un gros problème.
En effet, cette fonction est chargée de convertir un string Ansi de Delphi contenant du code UTF-8 (multi-byte) en WideString contenant de l'Unicode en format UTF-16.
UTF-16 code la majeure partie des codepoint Unicode en un seul mot de 17 bits, mais certains sont codés sur deux mots 16 bits.
En entrée, les caractères Unicode en UTF-8 sont codés sur 1, 2, 3 ou 4 octets. Et celle fonction UTFEncode est chargée de convertir UTF-8 en UTF-16.
Mais, UTF8Encode est incapable de traiter des codes UTF-8 sur 4 octets !
En effet, dans ce cas, la fonction plante tout simplement et le résultat retourné est une chaîne WideString vide.
J'ai donc décidé d'écrire ma propre fonction UTF8EncodeEx éliminant ce défaut. Mieux: si une combinaison d'octsts représente un codepoint invalide, non défini en Unicode, ma fonction signale l'anomalie en donnant l'index de l'octet invalide, tout en retournant le début de la chaîne convertie avant l'occurrence de l'octet invalide.
En ièces jointes à ce post, j'ai placé un fichier ZIP contenant le projet entier avec ma nouvelle fonction etlrprogramme de démo montrant le problème et sa solution.
Voici une capture d'écran:
Ceci représente le ésultat en utilisant le bouton "UTF8Decode_Klaus avec UTF8 4 bytes".
La 3ème colone montre le code ITF-8 hé,éré par ma fonction. Les 4 derniers octets 31 à 34 représentent un codepoint sur 4 octets:
Il est correctement traduit en UTF6 dans les deux derniers mots 11 et 12:31 F0
32 90
33 80
34 A4
Et voici le résultat avec le bouton "UTF8Decode standard sans UTF8 4 bytes":11 D840
12 DC24
Par contre, le bouton "UTF8Decode standard avec UTF8 4 bytes" donne le résultat suivant:
Mon implémentation est certainement maladroite et on peut certainement mieux faire, peut-être même en utilisant l'assembleur inline pour le traitement des groupes de bits des différents octets.
Qu'est-ce que vous pensez de ce code ?
Partager