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

Lazarus Pascal Discussion :

Encore des problèmes d'encodage


Sujet :

Lazarus Pascal

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 196
    Par défaut Encore des problèmes d'encodage
    Bonjour à tous et bonne année !

    Je continue à m'amuser à convertir de vieux projets Delphi, et j'achoppe aujourd'hui sur Dicogène, un projet écrit jadis avec mon ami Yves Ouvrard. Ça prend des fichiers textes, par exemple le texte d'un livre entier, et ça devait en récupérer les mots avec des statistiques (occurrences, nombre de mots, longueur moyenne des phrases, des mots, etc...) On trouve encore le binaire sur le site de l'académie de Rouen, où la paternité m'en est généreusement accordée alors que j'ai seulement eu l'idée et corrigé quelques bugs

    http://lettres.ac-rouen.fr/cdrom/fic...g/dicogene.htm

    La conversion Delphi-Lazarus fonctionne bien, mais j'ai un problème avec l'encodage, comme d'habitude :

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    procedure TForm1.BitBtn2Click(Sender: TObject);
      var i, p : integer;
          mot : string;
          car : char;
      const FTemp = 'C:\windows\temp\dicoG.tmp';
    begin
      Cessez := false;
      // initialisation des variables statistiques
      NMots := 0;
      NPhrases := 0;
      NCarAlpha := 0;
      For i := 0 to Flux.Size - 1 do
        begin
          Flux.Read (Car, 1);
          case Car of
             'a'..'z',
             'A'..'Z',
             'À'..'Ö', 'Ø'..'ö', 'ø'..'ÿ' :
               begin
                 mot := mot + car;
                 inc (NCarAlpha);
               end;
             else
               begin   //détecter fin de phrases
               if (pos (car, '.?!') > 0)
                 and (length (mot) > 1)
                 then inc (NPhrases);
               if mot > '' then  //fin de mot
                 begin
                   if Liste.Find (mot, p)
                     then Liste.incremente (p)
                     else Liste.AddObject(mot, TStat.Create) ;
                   inc (NMots);
                   mot := '';
                 end;
               end;
            end;
          application.processmessages;
          if Cessez then Break;
          Panel1.Width := trunc (i * RichEdit1.width / Flux.size);
        end;
      Flux.Free;
     
      // exclus
      with Form2 do
        if CheckExclus.Checked then
          for i := 0 to Memo1.Lines.count - 1 do
            if Liste.Find (Memo1.lines[i], p)
              then Liste.Delete (p);
     
      Liste.Sorted := False;
      Case Form2.RadioGroup1.ItemIndex of
        0 :; // alpha : ne rien faire ;
        1 :  // alpha + fréq : éditer
            for i := 0 to Liste.count - 1
              do Liste [i] := format (liste[i] + #9#9'%d', [liste.freq [i]]);
        2 : // fréq : retrier
          begin
            Liste.TrieFreq (0, liste.count - 1);
            for i := 0 to Liste.count - 1
              do Liste [i] := format (liste[i] + #9#9'%d', [liste.freq [i]]);
          end;
        end;
     
      Liste.Insert(0,  #13#10'Résultats'#13#10);
      // ajout des Stats à la liste;
      with Form2 do
        begin
          if CheckMCarMot.Checked
            then Liste.Insert (
              0, Format ('Nombre moyen de caractères par mot : %.5f',
                [NCarAlpha / NMots]));
          if CheckNCarAlpha.Checked
            then Liste.insert (
              0, Format ('Nombre de caractères alphabétiques : %d',
                [NCarAlpha]));
          if CheckMotsPhrase.Checked
            then Liste.insert (
              0, Format ('Nombre moyen de mots par phrase : %.5f',
              [NMots / NPhrases]));
          if CheckNPhrases.Checked
            then Liste.insert (
              0, Format ('Nombre de Phrases : %d', [NPhrases]));
          if CheckNMots.Checked
            then Liste.insert (
              0, format ('Nombre de mots : %d', [NMots]));
          if (CheckNMots.Checked)
            or (CheckNPhrases.Checked)
            or (CheckMotsPhrase.Checked)
            or (CheckNCarAlpha.Checked)
            or (CheckMCarMot.Checked)
            then Liste.insert (0, 'Statistiques'#13#10);
        end;
    Quand le compilateur rencontre 'A'..'Z', il beugle que ça fait duplicate case label avec 'a'..'z''. OK. Et quand je remplace par 'A'..'z', il bute sur 'À'..'Ö' (Constant and CASE types do not match) ; aucun caractère accentué ni avec diacritique n'est accepté. Si je me contente de 'A'..'Z', ça compile. (Je peux écrire « Case car of 'A'..'z', #140, #156, #158..#159, #192..#214, #216..#246, #248..#255 : » en imaginant que ça travaille sur des chaînes ANSI, ça passe à la compilation, mais ça récupère les caractères accentués avec un codage incorrect (Ú pour é dans fichiers sauvegardés, points d'interrogation dans TMemo). C'est donc un problème ansi/utf8 que je ne sais pas régler, alors que la solution doit être quasi évidente pour plusieurs d'entre vous.

    Sans vous moquer trop de moi – quoique j'aie peur de le mériter –, pourriez-vous m'aider dans cette mauvaise passe ? Je joins un 7z des sources.

    Merci d'avance.
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Encore des problèmes avec le BDE
    Par Flint dans le forum C++Builder
    Réponses: 19
    Dernier message: 31/12/2007, 23h26
  2. Encore des problèmes de tailles de div liées
    Par gibet_b dans le forum Mise en page CSS
    Réponses: 14
    Dernier message: 04/07/2007, 08h46
  3. Réponses: 4
    Dernier message: 05/10/2006, 13h10
  4. Encore des problèmes de variables
    Par mat99 dans le forum Langage
    Réponses: 1
    Dernier message: 18/11/2005, 10h26
  5. Réponses: 8
    Dernier message: 10/08/2004, 11h49

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