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

Langage Delphi Discussion :

CharToHex Char --> Unicode Hexa


Sujet :

Langage Delphi

  1. #1
    Membre actif Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 312
    Points : 272
    Points
    272
    Par défaut CharToHex Char --> Unicode Hexa
    Bonjour,

    Je rencontre un petit problème avec la sortie de ma fonction. Je ne parviens pas à retrouver la valeur Unicode.

    Je rentre un caractère '𝑎' donc sa valeur Unicode = 1D44E, ma fonction me renvoi la valeur 0D835

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    { CharToHex }
    function CharToHex(Const Unicode: Char): String;
    begin
      Result := IntToHex(Integer(Unicode), 5);
    end;
     
    // U+1D44E = 𝑎
    ShowMessage(CharToHex('𝑎'));
    //ShowMessege = 0D835
    J'ai constaté que peu importe le type de caractères que je saisis dans cette catégorie, ma fonction renvoie toujours la même valeur (0D835).
    Nom : Capture.PNG
Affichages : 90
Taille : 71,9 Ko

    Je rentre un caractère 'A' donc sa valeur Unicode = 0041, ma fonction me renvoi bien la valeur 0041
    La fonction na prend pas en charge les valeurs plus grande que FFFF

    Serait-il le type Integer qui me fausserait la conversion ?

    Merci

  2. #2
    Membre actif Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 312
    Points : 272
    Points
    272
    Par défaut
    J'ai bien un problème de conversion

    Si je prends la valeur en Hexa : 1D44E convertie en décimale = 119886

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ShowMessage(IntToStr(Ord('𝑎')));
    // ShowMessage = 55349
    55349 --> Hexa D835 n’est pas un caractère Unicode valide.

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 763
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 763
    Points : 13 381
    Points
    13 381
    Par défaut
    Un caractère unicode fait 16 bits, pas un de moins pas un de plus : soit $FFFF max.

    Pour atteindre les caractères suivants dans le tableau il est fait appel à des surrogate pairs ; un codage du caractère réel sur plusieurs "caractères" unicode.

    Ces paires se calculent. Ce que tu récupères toi en est juste une partie : le high surrogate ($D800 à $DBFF).

    En bref ton caractère est en fait une chaîne qu'il faut décortiquer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    uses System.Character;
     
    function CharToHex(Const Unicode: string): String;
    begin
      const ca = Unicode.ToCharArray;
     
      // Surrogate pair ?..
      if (Length(ca) = 2) and ca[0].IsHighSurrogate and ca[1].IsLowSurrogate then
        Result := IntToHex(((ca[0].ToUCS4Char -$D800) *$400) +(ca[1].ToUCS4Char -$DC00) +$10000, 5)
     
      // ...non
      else if Length(ca) = 1 then
        Result := IntToHex(ca[0].ToUCS4Char, 5)
     
      else raise Exception.Create('Caractère invalide');
    end;

  4. #4
    Membre actif Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 312
    Points : 272
    Points
    272
    Par défaut
    Merci Andnotor,

    Donc si j'ai bien compris

    Si la premier valeur et comprise entre D800 et DBFF (IsHighSurrogate) renvoie True et si la deuxième valeur et comprise entre DC00 et DFFF (IsLowSurrogate) renvoie True, donc nous sommes en (Surrogate Pairs).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (Length(ca) = 2) and ca[0].IsHighSurrogate and ca[1].IsLowSurrogate then
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    else if Length(ca) = 1 then
        Result := IntToHex(ca[0].ToUCS4Char, 5)
    else Unicode 0000 - FFFF

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

Discussions similaires

  1. [glib 2.40] unicode hexa
    Par Gaulouis dans le forum Linux
    Réponses: 1
    Dernier message: 05/06/2016, 11h21
  2. type char caractère unicode
    Par new_wave dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 13/07/2008, 15h17
  3. tableau de char vers string hexa
    Par andromeda dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 22/07/2007, 23h10
  4. Réponses: 15
    Dernier message: 22/12/2006, 14h28
  5. Réponses: 6
    Dernier message: 06/10/2005, 11h30

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