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 :

TFileStream et caractères bizarres


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2003
    Messages : 119
    Points : 115
    Points
    115
    Par défaut TFileStream et caractères bizarres
    Bonjour à tous,

    J'ai un problème avec TFileStream sur delphi 7, je fais le simple code ci-dessous.
    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
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      fs: TFileStream;
      buffer: array[0..255] of char;
      str: string;
      len: integer;
    begin
      fs:= TFileStream.Create('D:\Travaux\test.txt', fmOpenReadWrite or fmShareDenyNone);
      try
        str:= 'aaaaaa';
        //fs.Position:= 0;
        //len:= fs.Read(buffer, Length(buffer));
        fs.seek(0, soFromEnd);
        fs.Write(PChar(str)^, Length(str));
      finally
        fs.Free;
      end;
    end;
    Le contenu du fichier test.txt contient seulement test123 et j'essaye d'ajouter simplement des "a" à la fin, je n'ai aucun problème au bureau, mais quand j'essaye sur mon pc, le contenu du fichier test.txt devient test123慡慡慡, alors qu'il devrait écrire test123aaaaaa.
    WIN7 64 sur les deux pcs
    Quelqu'un aurait-il une idée?

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2003
    Messages : 119
    Points : 115
    Points
    115
    Par défaut
    Parfois, il enregistre test123aa dans le fichier test.txt au lieu de test123aaaaaa

  3. #3
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 862
    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 862
    Points : 11 330
    Points
    11 330
    Billets dans le blog
    6
    Par défaut
    que valent SizeOf(Char) et Stream.Size après avoir juste lu 'test123' ?
    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
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2003
    Messages : 119
    Points : 115
    Points
    115
    Par défaut
    SizeOf(char) vaut 2 et fs.Size vaut 16

  5. #5
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Citation Envoyé par Jeankiki Voir le message
    SizeOf(char) vaut 2 et fs.Size vaut 16
    delphi 7 et tu es en wideChar !!!

    essaye de forcer le Ansi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    str: AnsiString;
    ...
    fs.Write(PAnsiChar(str)^, Length(str));

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2003
    Messages : 119
    Points : 115
    Points
    115
    Par défaut
    Malheureusement, ce changement ne fait rien du tout.

  7. #7
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    Citation Envoyé par Jeankiki Voir le message
    SizeOf(char) vaut 2 et fs.Size vaut 16
    très surprenant...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      fs.Write(str[1], Length(str) * SizeOf(Char));
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2003
    Messages : 119
    Points : 115
    Points
    115
    Par défaut
    @Paul : J'ai essayé cette ligne de code sur mon pc au bureau mais il me double le nombre de caractère 'a' sur Delphi 7, j'obtiens test123aaaaaaaaaaaa
    J'ai aussi refait un test sur Delphi xe, et voici ce que j'obtiens quand j'ouvre avec notepad++
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    test123anulanulanul
    en utilisant la ligne de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fs.Write(PChar(str)^, Length(str));

  9. #9
    Membre chevronné Avatar de chaplin
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 215
    Points : 1 819
    Points
    1 819
    Par défaut
    Le lecture du résultat est obtenu avec Delphi ou en ouvrant Notepad ?

  10. #10
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Citation Envoyé par chaplin Voir le message
    Le lecture du résultat est obtenu avec Delphi ou en ouvrant Notepad ?
    Vu le resultat je dirais plutot un truc du genre Notepad++

    La question est plutot "que se passe t'il si tu le fait sur un fichier vierge ?"
    J'ai l'impression que ton fichier est en unicode, d'ou le probleme.
    Le deuxieme probleme, c'est pourquoi le sizeOf(Char) vaut 2 !!!
    Es-tu sur d'etre en delphi 7 ?
    ou alors une redeclaration de Char, PChar, ... dans le debut ou dans les uses de ton fichier !
    Que vaut SizeOf(System.PChar) ?

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2003
    Messages : 119
    Points : 115
    Points
    115
    Par défaut
    @guillemouze :
    J'ai fais la lecture avec notepad++
    Si je fais le test sur un pc avec Delphi 7, il écrit bien le nombre de caractère demandé, donc
    Sur Delphi XE2, j'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    test123anulanulanul
    Si je fais le même petit programme sur autre pc qui est aussi en win7 64bits, j'obtiens test123aaa (lu avec notepad) que se soit avec Delphi 7 ou Delphi XE2.

  12. #12
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 534
    Points : 25 082
    Points
    25 082
    Par défaut
    Au final, tu utilises quel Delphi 7 ou XE2 ?
    Parce qu'effectivement, tu sembles depuis le début mélanger les deux !
    Pense qu'en Delphi 7, le Char et String c'est implicitement le type AnsiChar et AnsiString dont le caractère fait 1 octet
    Depuis 2009 donc en XE2 cela changele Char et String c'est implicite WideChar et UnicodeStrint et le caractère occupe 2 octets !
    Il est évident que tu dois faire attention à cela lorsque tu manipules directement la mémoire

    Quel est le résultat ? bon ou pas ?

    fs.Size vaut 16
    le fichier ne contient que 'test123' donc même si l'on double, cela ne donne que 14 !
    Es-tu précis dans ce que tu nous fournis ?
    Si oui, les 2 octets doivent être le BOM UNICODE : FE FF (þÿ) qui démarre le fichier !

    Utilise UltraEdit pour lire le fichier en mode hexadécimal, Notepad ou Notepad++ sont des outils textes, ils gèrent tous deux le BOM ne l'affiche pas et gère les caractères selon l'encodage Unicode (donc 2 octets par caractères) donc ce qui s'affiche est une interprétation du contenu réel

    'test123aaa' c'est bien ce que tu obtiens ?
    C'est assez étrange !

    'test123慡慡慡' en unicode c'est un binaire que l'on peut représenter en ANSI 'þÿ.t.e.s.t.1.2.3aaaaaa'
    . indique un zéro


    @guillemouze
    SizeOf(System.PChar), ça donnera 4 ou 8, mais cela ne devrait pas changer le comportement !

    La méthode de Paul TOTH, est la méthode la plus fiable, mais le résultat dans le fichier sera différent
    A toi de veiller en XE2 à utiliser le type AnsiString et PAnsiChar si tu veux utiliser de l'ANSI
    Si à l'inverse tu gère de l'unicode dans ton fichier, tu devras utiliser un PWideChar en Delphi 7, je te conseille d'utiliser la fonction StringToWideChar
    Il n'y a quasiment pas de modification de code lorsque l'on passe de D7 à DXE2 si l'on reste dans une utilisation simple du string mais dès que l'on manipule des caractères directement en octet, le code D7 et DXE2 sera différent !
    le choix d'avoir modifié StringToWideChar de AnsiString à UnicodeString parait à la base saugrenue de la part de CodeGear mais cela permet de ne pas toucher au code existant

    un code fonctionnel dans les DEUX delphi pour un fichier Unicode, je l'ai tapé directement sur le forum, j'espère ne pas avoir commis d'erreur

    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
    procedure TForm1.Button1Click(Sender: TObject);
    var
      fs: TFileStream;
      str: string;
      strw: PWideChar;
      strwsize, strwbufsize: integer;
    begin
      fs := TFileStream.Create('D:\Travaux\test.txt', fmOpenReadWrite or fmShareDenyNone);
      try
        str := 'aaaaaa';
        strwsize := Length(str) * SizeOf(WideChar); // taille des caractères
        strwbufsize := strwsize + SizeOf(WideChar); // taille des caractères plus le double zéro terminal
        GetMem(strw, strwbufsize); 
        try
          fs.seek(0, soFromEnd);
          fs.Write(StringToWideChar(strw, str, strwbufsize)^, strwsize);
        finally
          FreeMem(strw);
        end;
      finally
        fs.Free;
      end;
    end;


    Je te conseille de lire Activation des applications pour Unicode
    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

  13. #13
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Pour ma part sous XE, j'utilise la même méthode que la savetofile du TStringList

    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
     
    Procedure AddToLog(AFileName, AText :String);
    var
      FFile : TFileStream;
      sLigne : String;
      Buffer : TBytes;
      Encoding : TEncoding;
    begin
        sLigne := FormatDateTime('[DD/MM/YYYY hh:mm:ss] ',Now) + AText;
        if FileExists(AFileName) then
        begin
          FFile := TFileStream.Create(AFileName,fmOpenReadWrite);
          FFile.Seek(0,soFromEnd);
        end else
          FFile := TFileStream.Create(AFileName,fmCreate);
        try
          // Ajoute un retour à la ligne pour le fichier text
          sLigne := sLigne + #13#10;
     
          Encoding := TEncoding.Default;
          Buffer := Encoding.GetBytes(sLigne);
          FFile.Write(Buffer[0],Length(Buffer));
        finally
          FFile.Free;
        end;
      end;
    end;
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2003
    Messages : 119
    Points : 115
    Points
    115
    Par défaut
    Merci à vous deux pour l'explication, je vais regarder à ça.
    @ShaiLeTroll : Non, je ne mélange pas les deux, c'est simplement que j'ai essayé de faire le test sur les deux, sur deux pc différents et que j'obtiens des valeurs différentes et c'est ça que je ne comprends pas.
    Pour résumé, j'ai deux pc avec win7 64 bits, sur les deux pcs, j'ai delphi 7 et delphi xe2.
    Sur le premier pc, je n'ai pas le résultat escompter que se soit avec delphi 7 ou delphi xe2 (càd, test123aaa avec le bloque note)
    Sur le second pc:
    quand j'exécute à partir de Delphi 7, j'obtiens test123aaaaaa (notepad++)
    quand j'exécute à partir de Delphi XE2, j'obtiens test123anulanulanul (notepad ++)
    Ce que je ne comprends pas c'est le comportement entre les deux PC.

  15. #15
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    Citation Envoyé par Jeankiki Voir le message
    Merci à vous deux pour l'explication, je vais regarder à ça.
    @ShaiLeTroll : Non, je ne mélange pas les deux, c'est simplement que j'ai essayé de faire le test sur les deux, sur deux pc différents et que j'obtiens des valeurs différentes et c'est ça que je ne comprends pas.
    Pour résumé, j'ai deux pc avec win7 64 bits, sur les deux pcs, j'ai delphi 7 et delphi xe2.
    Sur le premier pc, je n'ai pas le résultat escompter que se soit avec delphi 7 ou delphi xe2 (càd, test123aaa avec le bloque note)
    Sur le second pc:
    quand j'exécute à partir de Delphi 7, j'obtiens test123aaaaaa (notepad++)
    quand j'exécute à partir de Delphi XE2, j'obtiens test123anulanulanul (notepad ++)
    Ce que je ne comprends pas c'est le comportement entre les deux PC.
    alors XE2 est en UnicodeString, d'où le caractère "nul" (0) après entre les a, jusque là tout va bien pour le PC n°2

    si le fichier du PC n°1 contient un préfixe UTF il va réinterpréter le contenu...d'où les caractères inattendus.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  16. #16
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 534
    Points : 25 082
    Points
    25 082
    Par défaut
    Evite Notepad++ !
    Utilise un éditeur Hexadécimal comme 'Hex Editor' qui est gratuit et tout à fait convenable pour ce type de vérification

    Notepad++ interprète ton fichier, je pense qu'il contenait un BOM, tant que tu n'auras pas utiliser l'outil approprié sur tous les fichiers, il est possible qu'un PC a un fichier avec BOM suite justement à l'ouverture par Notepad++ et que l'autre PC le fichier ne l'a pas !

    Il semble que ton fichier, qui contient anul ne contient plus de BOM

    Fait le test de SizeOf(Char) et fs.size à l'ouverture

    le fichier contient 'test123'
    si size = 7 alors ANSI - le format souhaité je pense
    si size = 14 alors UNICODE sans BOM, ça c'est typiquement de XE2
    si size = 16 alors UNICODE avec BOM, ça c'est un parasitage de Notepad++ à moment donné !

    En plus, si tu sembles un coup utilisé le 'bloc notes' (notepad) et Notepad++, si tu ne contrôle pas avec les mêmes outils !

    Tes résultats changent à chaque fois en plus, un coup 'aaa' car len = 3, un coup '慡慡慡' parce que 'aa' correspond à '慡' dans l'encode Unicode, un coup 'anulanulanul' par ce que tu enregistre 6 octets d'une chaine unicode qui en contient 12
    As-tu analysé à chaque fois, le comportement des différents codes fournis et de l'importance du facteur 2 entre mémoire et caractère

    D'ailleurs sais-tu le format de fichier que tu souhaites ? ANSI ? UTF8 ? UNICODE ? avec ou sans BOM ? big-endian ou little-endian ?
    C'est très important, cela peut changer radicalement nos réponses !

    Supposons ANSI comme cela devait l'être en D7
    j'ai fourni plus haut la version UNICODE

    Je pense que depuis ce matin tu as déjà résolu ton problème puisque si tu as lu Activation des applications pour Unicode - Appels aux méthodes Write/WriteBuffer de TStream comme je te l'ai recommandé à 10h21, cela explique l'utilisation d'un tampon AnsiString et non string

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm1.Button1Click(Sender: TObject);
    var
      fs: TFileStream;
      str: AnsiString; // très important !
    begin
      fs:= TFileStream.Create('D:\Travaux\test.txt', fmOpenReadWrite or fmShareDenyNone);
      try
        str:= 'aaaaaa';
        fs.seek(0, soFromEnd);
        fs.Write(str[1], Length(str) * SizeOf(AnsiChar)); // [1] c'est plus simple que PAnsiChar(str)^
      finally
        fs.Free;
      end;
    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

  17. #17
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 824
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 824
    Points : 15 249
    Points
    15 249
    Par défaut
    Salut,

    juste un détail :
    Citation Envoyé par ShaiLeTroll Voir le message
    Si oui, les 2 octets doivent être le BOM UNICODE : FE FF (þÿ) qui démarre le fichier !
    J'ai vérifié avec deux afficheurs hexa, en fait c'est l'inverse : ce genre de fichier commence par FF FE (ÿþ)

    Bonne journée,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2003
    Messages : 119
    Points : 115
    Points
    115
    Par défaut
    Il semblerait que ce soit Windows qui crée en unicode par défaut car le fichier d'origine, je l'ai créé avec Windows en utilisant le bloque note pour créer un fichier texte dans lesquels j'ai écrit test123.

    J'ai refait le test en faisant un fmCreate au lieu fmOpenReadWrite et là le fichier est rempli correctement (j'avais effacé le fichier d'origine pour voir comment Delphi XE2 réagit).

    Je n'avais pas vraiment d'apriori pour le type d'encodage, je suis parti du principe qu'il serai en ANSI

    Avant de faire les opérations ci-dessus, j'ai vérifié fs.size et il vallait 16

    @ShaiLeTroll : J'ai aussi essayé le petit code ci-dessous sur un des pc avec Delphi XE et j'ai aussi le résultat suivant "test123慡慡慡"

  19. #19
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Citation Envoyé par Jipété Voir le message
    J'ai vérifié avec deux afficheurs hexa, en fait c'est l'inverse : ce genre de fichier commence par FF FE (ÿþ)
    Donc ton fichier de base est bien en unicode, donc il faut que tu ecrive en unicode dedans. Donc il faut utiliser WideChar, ....
    apres, il faut regarder, mais FF FE et FE FF indique l'ordre des octets dans ton fichier.

  20. #20
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 534
    Points : 25 082
    Points
    25 082
    Par défaut
    A l'origine quel programme créera le fichier ?

    N'utilise que ce programme ! évite notepad ou notepad++
    Car tu fausses ton contexte !

    Pense que tu peux choisir l'encodage dans notepad !
    C'était déjà le cas sur XP !

    Au final quel Delphi ? 7 ou XE ?
    Qui écrira le fichier ? Qui le lira ?
    L'encodage le plus facile à utiliser sera choisi en fonction de ta réponse !

    Ton problème n'est pas spécialement le code Delphi mais ton fichier de départ !

    FE FF (þÿ) et FF FE (ÿþ)
    c'est le BOM UNICODE Big Endian et BOM UNICODE Little Endian

    Si l'on écrit directement un Stream de UnicodeString, c'est Little Endian qu'il faut choisir donc FF FE (ÿþ)
    On le voit avec 'anul', 'a' puis zéro, c'est du Little Endian
    sinon tu aurais du 'nula', zéro puis 'a' qui est du Big Endian

    test123慡慡慡
    Big Endian : þÿ.t.e.s.t.1.2.3aaaaaa
    Little Endian : ÿþt.e.s.t.1.2.3.aaaaaa
    . désigne un zéro
    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. [AJAX] Caractères bizarres avec AJAX
    Par davinout dans le forum Général JavaScript
    Réponses: 18
    Dernier message: 02/04/2007, 22h33
  2. caractère bizarre devant mon menu
    Par dunbar dans le forum Langage
    Réponses: 2
    Dernier message: 16/07/2006, 19h40
  3. Réponses: 6
    Dernier message: 24/03/2006, 13h50
  4. [FTP] XmlHttpRequest + caractères bizarres
    Par masseur dans le forum Langage
    Réponses: 18
    Dernier message: 25/01/2006, 16h45
  5. Réponses: 6
    Dernier message: 06/12/2005, 09h41

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