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 :

Une histoire de caractères accentués déformés


Sujet :

Langage Delphi

Vue hybride

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

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 540
    Par défaut Une histoire de caractères accentués déformés
    Bonjour à tous

    Voici un aperçu du problème :




    et là :



    Grosso modo, je sais quelles sont les procédures incriminées ds mon prog, donc là où il faudrait intervenir. Mais comment rectifier, pour Windows et pour Delphi (7), le jeu de caractères afin que, ni l'un ni l'autre ne les déforment ?

    Merci

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 086
    Par défaut
    La confusion é et Ú, c'est typique d'un conflit Windows-1252 et CP863 !

    Essaye CharToEOM et EOMToChar
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 540
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    La confusion é et Ú, c'est typique d'un conflit Windows-1252 et CP863 !

    Essaye CharToEOM et EOMToChar
    Et le L' : l'apostrophe fait tousser, elle aussi.

    Je vais tester tout ça.

    Merci

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 540
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    La confusion é et Ú, c'est typique d'un conflit Windows-1252 et CP863 !

    Essaye CharToEOM et EOMToChar
    CharToOEM() en élimine pas mal, mais il en reste. Je fais l'opération inverse ( OEMToChar() pour plus de sûreté : idem.

    Photo :


    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
     
    Procedure Epurer_Caracteres_Deformes;
    Var   i : integer;
     
    begin
          Ptr_Tab_Char_Source := @Tab_Char_Source_OEM[0];  // type Pointer
          Ptr_Tab_Char_Dest := @Tab_Char_Dest_OEM[0];			 // type Pointer
     
          For i := 0 TO Nb_F_Ds_Base DO  // Nb de titres de fiches dans la base
               begin
                      StrCopy( @Tab_Char_Source_OEM, PChar (Lst_Noms_Courts_F_Ds_Base[i]) );  // LST..etc = TStringList
                      CharToOEM(Ptr_Tab_Char_Source, Ptr_Tab_Char_Dest);
                      StrCopy( PChar( Lst_Noms_Courts_F_Ds_Base[i]), Ptr_Tab_Char_Dest);
               end;
     
    end;

  5. #5
    Membre émérite
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Par défaut
    D'où viennent ces citations ? De l'internet, I presume ?

    C'est peut-être un problème lié au fait que certains sites sont en Unicode, il faudrait dans ce cas voir du côté des "WideString", mais je n'ai aucune idée de ce que Delphi 7 sait faire à ce sujet.

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 540
    Par défaut
    Citation Envoyé par CapJack Voir le message
    D'où viennent ces citations ? De l'internet, I presume ?

    C'est peut-être un problème lié au fait que certains sites sont en Unicode, il faudrait dans ce cas voir du côté des "WideString", mais je n'ai aucune idée de ce que Delphi 7 sait faire à ce sujet.
    1/ Quelles citations ? Le code ci-dessus ? C'est le mien.

  7. #7
    Membre émérite
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Par défaut
    Citation Envoyé par bvsud Voir le message
    1/ Quelles citations ? Le code ci-dessus ? C'est le mien.
    Je voulais parler de ce qui est sur le fond vert. Les chaînes à traiter.

  8. #8
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 086
    Par défaut
    Citation Envoyé par bvsud Voir le message
    CharToOEM() en élimine pas mal, mais il en reste. Je fais l'opération inverse ( OEMToChar() pour plus de sûreté : idem.
    C'est que ce n'est pas ce CharSet !
    A la limite, tu peux coder la fonction de décodage par tatonnement !
    Si OEMToChar ne commet pas d'erreur, tu l'utilise, puis tu corriges ce qui traine avec un for et un case

    Voir aussi UTF8Encode ou WideCharToString, mais je ne suis pas convaincu, tu semble avoir un codage sur un simple octet et non multi-octet !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  9. #9
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 540
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    C'est que ce n'est pas ce CharSet !
    A la limite, tu peux coder la fonction de décodage par tatonnement !
    Si OEMToChar ne commet pas d'erreur, tu l'utilise, puis tu corriges ce qui traine avec un for et un case

    Voir aussi UTF8Encode ou WideCharToString, mais je ne suis pas convaincu, tu semble avoir un codage sur un simple octet et non multi-octet !

    Donc, il me faudrai :
    1/ Détecter le CharSet actif dans mon application
    2/ Affecter à mon appli le CharSet correspondant à "863 MS-DOS Canadian French"

    Les API ChatToOEM et OemToChar (avec ou sans pointeur sur un buffer) ne résolvent rien. Mon prog (D7 sous Win32) écrit dans une autre page de code que celle OEM 863.

    Je cherche les API pour ça.

    Je vois arriver le moment où il ne me restera plus qu'à écriure ça en assembleur en ligne, comme ds les années 80-90 qd je programmais en C. Mais charger les DS:SI et ES: DI , ça ne se fait plus de la même façon en Win32...

  10. #10
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 086
    Par défaut

    Je n'ai rien compris à ce que tu viens de dire !

    D'où vient les noms de fichiers ?
    C'est FindFirst qui les renvois ?

    Le problème ce n'est pas le CharSet de l'application quoi doit être probablement Windows-1252 mais celui de ta liste, tu es sûr que ta liste est en "863 MS-DOS Canadian French"

    La confusion é et Ú, c'est typique d'un conflit Windows-1252 et CP863 !
    Est-ce mes propos qui t'ont induit en erreur, j'ai vu tout de suite é et Ú par qu'il est connu (je l'ai souvent eu celui là lorsque je générais des fichiers BAT à la volée)

    Si l'on étudie Æ et ´ qui ont théoriquement la même valeur l'un en Windows-152 et l'autre en OEM
    1252 = ... = OEM = CP863
    Æ = 00C6 = 198 = ã = ╞
    ¡ = 00B4 = 161 = ┤ = ´
    ' = 0027 = 39 = ' = '

    Bizarre, OEM et CP863 sont différents, je pensais que le DOS était en 863, ne cherchons pas (utilise la console CMD et lance EDIT, tu verras en faisant ALT+...) ou UltraEdit et son option OEM

    Cela ne colle pas, il faudrait que 00C6 (Æ) soit l'équivalent d'un ´ ou ' dans l'encodage qui n'est manifestement pas du OEM mais un autre CharSet, le trouver ne sera pas facile par contre trouver manuellement les correspondances et de faire une fonction de substitution



    grosso modo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function Convert(const S: AnsiString): AnsiString;
    const
      MAP: array[AnsiChar] of AnsiChar = 
       (#0, #1, #2, ..., '´', ...); // un LONG tableau de 256 caractères, la position étant en 1252, par exemple 198 contient '´' ...
    var
      I: integer;
    begin
      SetLength(Result, Length(S));
      for I := 1 to Length(S) do
       Result := Map[S[I]];
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. Réponses: 3
    Dernier message: 07/03/2009, 14h44
  2. Remplacer les caractères accentués dans une chaine
    Par shaun_the_sheep dans le forum Général Java
    Réponses: 5
    Dernier message: 07/05/2008, 10h41
  3. Caractères accentués d'une dll microsoft
    Par rpoulin dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 30/04/2008, 16h08
  4. [SQL] Les caractère accentués s'affichent mal après une requête SQL
    Par sayerh dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 04/03/2008, 11h56
  5. Réponses: 2
    Dernier message: 21/09/2007, 14h43

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