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

Autres IDE Pascal Discussion :

Problème de Charset variable ! [CodeTyphon]


Sujet :

Autres IDE Pascal

  1. #1
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 854
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 854
    Points : 11 287
    Points
    11 287
    Billets dans le blog
    6
    Par défaut Problème de Charset variable !
    Bonjour,
    Je tâche de mettre l'export HTML de ma bibliothèque iTunes en BD UTF-8. Cette bibliothèque est originaire d'un PC sous W7.
    C'est essentiellement le chemin des morceaux qui me pose problème :
    1. '&' est remplacé par '&' ce qui est trivial à pallier ;
    2. des caractères (souvent accentués) sont remplacés par un code hexa style '%C5%A1', plus complexe à gérer pour les raisons exposées ci-après.


    Par exemple, je dois traduire :
    file://localhost/C:/Users/R%C3%A9gine/Music/iTunes/iTunes%20Media/Music/Delphine%20Volange/_..Et%20de%20Delphine%20Volange%20le%20ciel%20%C3%A9tait/05%20H%C3%B4tel%20Chopin.mp3
    en
    file://localhost/C:/Users/Régine/Music/iTunes/iTunes Media/Music/Delphine Volange/_..Et de Delphine Volange le ciel était/05 Hôtel Chopin.mp3
    Ce qui se complique pour d'autres chemins, dont les codes ne sont pas évidents... Selon les morceaux, 'À' (A majuscule avec accent grave) est codé par '%C2%A7' ou '%C3%80', par exemple, alors que sous Word il est donné pour 00C0 ! Et que Char($C2A7) me donne autre chose...

    Ceci m'oblige à tâtonner, faute que fonctionne par exemple S := TIdURI.URLDecode(KeyValue);.

    Je manque d'une solution globale, univoque, efficace.

    Merci pour vos pistes !

    [EDIT] Les exemples que je donne ne sont pas forcément justes, mais issus d'un mix qualitatif de mes nombreux errements...
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  2. #2
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 419
    Points : 1 096
    Points
    1 096
    Par défaut
    Bonjour,

    as tu testé UTF8ToWinCP aux traductions de % près qui est normalement traité via URLdecode

    Cordialement

  3. #3
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 854
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 854
    Points : 11 287
    Points
    11 287
    Billets dans le blog
    6
    Par défaut
    C'est malheureusement inefficace ; merci.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 854
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 854
    Points : 11 287
    Points
    11 287
    Billets dans le blog
    6
    Par défaut
    Finalement, pas si variable que ça ! Mais il y avait tellement de caractères bizarrement accentués et tantôt en minuscules, tantôt en majuscules (titres de chansons oblige), que j'ai cru à des doublons.
    Résolu au pris d'un remplacement systématique en piochant dans un tableau.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Bonsoir peut-être une solution ici
    ou la avec la methode ISO_8859_1ToUTF8 Si non j'ai trouvé ça mais c'est pour l'encodage. Inverser la méthode ne me semble pas très compliqué.

    Bonne soirée

    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  6. #6
    Membre éclairé

    Homme Profil pro
    Rédacteur technique (retraité)
    Inscrit en
    Octobre 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 81
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Rédacteur technique (retraité)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 168
    Points : 807
    Points
    807
    Par défaut
    Bonjour,

    Citation Envoyé par tourlourou Voir le message
    ...
    Résolu au pris d'un remplacement systématique en piochant dans un tableau.
    A mon avis répertorier les caractères accentués (ou autres) dans un tableau est forcément limité et n'est même pas nécessaire.

    Il suffit de rechercher toutes les séquences de la forme '%xx' (avec xx de 00 à FF) et de remplacer chacune de ces séquences de trois caractères par un unique caractère exprimé par Char($xx) et ce quel que soit xx.

    La seule précaution à prendre est de faire cette substitution dans une variable chaîne ordinaire, pas dans une propriété chaîne car la chaîne résultat présente des états transitoires intermédiaires invalides d'un point de vue UTF-8 (lesquels peuvent être rejetés par un éventuel setter de la propriété). La chaîne résultat n'est valide qu'une fois tous les %xx substitués.

  7. #7
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 854
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 854
    Points : 11 287
    Points
    11 287
    Billets dans le blog
    6
    Par défaut
    La curiosité l'ayant emporté, j'ai fait une version décodage, mais c'est galère.
    Limité aux caractères codés sur 3 octets maximum, ce qui était mon cas.
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
          S := UTF8StringReplace(SourceString, '&', '&', [rfReplaceAll]);
          PourCent := UTF8Pos('%', S);
          while PourCent > 0 do begin
            Hexa := '$' + UTF8Copy(S, PourCent+1, 2);
            c := StrToInt(Hexa);
            if c < $80 then
              Len := 1  // débute par 0
            else if (c and $E0) = $C0 then
              Len := 2  // débute par 110
            else if (c and $F0) = $E0 then
              Len := 3; // débute par 1110
            case Len of
              1:   CodePoint := c;
              2: begin
                   CodePoint := (c and $1F) shl 6;
                   if UTF8Copy(S, PourCent+3, 1) = '%' then
                     Hexa := '$' + UTF8Copy(S, PourCent+4, 2)
                   else raise Exception.Create('Longueur CodePoint erronée !');
                   c := StrToInt(Hexa);
                   CodePoint := CodePoint + (c and $3F);
              end;
              3: begin
                   CodePoint := (c and $F) shl 12;
                   if UTF8Copy(S, PourCent+3, 1) = '%' then
                     Hexa := '$' + UTF8Copy(S, PourCent+4, 2)
                   else raise Exception.Create('Longueur CodePoint erronée !');
                   c := StrToInt(Hexa);
                   CodePoint := CodePoint + ( (c and $3F) shl 6);
                   if UTF8Copy(S, PourCent+6, 1) = '%' then
                     Hexa := '$' + UTF8Copy(S, PourCent+7, 2)
                   else raise Exception.Create('Longueur CodePoint erronée !');
                   c := StrToInt(Hexa);
                   CodePoint := CodePoint + (c and $3F);
              end;
            else
              raise Exception.Create('Longueur CodePoint non gérée !');
            end;
            S := UTF8Copy(S, 1, PourCent-1) + UnicodeToUTF8(CodePoint) + UTF8Copy(S, PourCent+3*Len, UTF8Length(S)-PourCent+3*Len);
            PourCent := UTF8Pos('%', S);
          end;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  8. #8
    Membre éclairé

    Homme Profil pro
    Rédacteur technique (retraité)
    Inscrit en
    Octobre 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 81
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Rédacteur technique (retraité)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 168
    Points : 807
    Points
    807
    Par défaut
    Bonjour,

    Ho-la la! tu d'em... bien inutilement ! La solution à laquelle je pensait est bien plus bestiale que cela. Les octets composant un caractère UTF8 est déjà fournie dans la chaine source par un nombre correspondant de %xx consécutifs et xx donne la valeur hexadécimale de chacun d'eux, il suffit simplement de les mettre sous la forme convenable.
    Par exemple :

    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
    17
    Function ConvURL(S : RawByteString): string;
    Var Pourcent, c: Integer;
        Hexa : String;
        K: Char;
    Begin
          Result := S;
          PourCent := Pos('%', Result);
          while PourCent > 0 do begin
            Hexa := '$' + Copy(Result, PourCent+1, 2);
            If TryStrToInt(Hexa, c) Then
               K := Char(c)
            Else
               K := '?';   // %xx non hexadécimal
            Result := Copy(Result, 1, Pourcent-1) + k + Copy(Result, pourcent + 3, Length(Result) - Pourcent +3);
            PourCent := Pos('%', Result);
          end;
    end;

  9. #9
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 854
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 854
    Points : 11 287
    Points
    11 287
    Billets dans le blog
    6
    Par défaut
    Merci.

    Tu as raison, mais hier je voulais mieux comprendre les codages et mécanismes, et je m'étais réservé cette approche pour cette après-midi !
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  10. #10
    Membre éclairé

    Homme Profil pro
    Rédacteur technique (retraité)
    Inscrit en
    Octobre 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 81
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Rédacteur technique (retraité)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 168
    Points : 807
    Points
    807
    Par défaut Vous avez dit "UTF-8", mais c'est très simple !
    Si ça peut aider, en PJ un document de ma conception sur le codage UTF-8 qui évite les fastidieux discours (et en anglais de surcroit) des spécifications Unicode ou ISO 10648.
    Images attachées Images attachées

  11. #11
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 854
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 854
    Points : 11 287
    Points
    11 287
    Billets dans le blog
    6
    Par défaut
    Il est très clair, merci !
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

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

Discussions similaires

  1. [PERL] problème désallocation de variable
    Par LE NEINDRE dans le forum Langage
    Réponses: 11
    Dernier message: 24/08/2005, 10h07
  2. Problème d'initialisation variable tableau
    Par HeZiX dans le forum Langage
    Réponses: 3
    Dernier message: 08/06/2005, 16h30
  3. Problèmes avec les variables final
    Par casolaro dans le forum Langage
    Réponses: 7
    Dernier message: 09/12/2004, 14h29
  4. Problème de charset
    Par Yodalf dans le forum Langage
    Réponses: 3
    Dernier message: 21/10/2004, 09h29
  5. Réponses: 6
    Dernier message: 28/05/2004, 09h39

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