IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

La fonction UTF8Decode de Delphi 6 PE est incomplète ou a un gros bug !


Sujet :

Composants VCL Delphi

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 371
    Billets dans le blog
    1
    Par défaut La fonction UTF8Decode de Delphi 6 PE est incomplète ou a un gros bug !
    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:
    Nom : aa1.png
Affichages : 180
Taille : 22,6 Ko
    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:
    31 F0
    32 90
    33 80
    34 A4
    Il est correctement traduit en UTF6 dans les deux derniers mots 11 et 12:
    11 D840
    12 DC24
    Et voici le résultat avec le bouton "UTF8Decode standard sans UTF8 4 bytes":
    Nom : aa2.PNG
Affichages : 176
Taille : 20,0 Ko

    Par contre, le bouton "UTF8Decode standard avec UTF8 4 bytes" donne le résultat suivant:
    Nom : aa3.png
Affichages : 175
Taille : 17,7 Ko

    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 ?
    Fichiers attachés Fichiers attachés

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/05/2006, 00h14
  2. Réponses: 17
    Dernier message: 14/02/2006, 00h21
  3. Comment appeler une fonction JavaScript depuis Delphi ?
    Par Alfred12 dans le forum Web & réseau
    Réponses: 4
    Dernier message: 17/06/2005, 18h15
  4. Existe-t-il une fonction Eval() sous Delphi ?
    Par Hell dans le forum Langage
    Réponses: 5
    Dernier message: 20/12/2004, 17h45
  5. Fonction pour savoir si un ordi est connecté au reseau
    Par LitteulKevin dans le forum Windows
    Réponses: 17
    Dernier message: 13/09/2004, 14h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo