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

Contribuez Delphi Discussion :

Recopier fichier ANSI vers fichier Unicode


Sujet :

Contribuez Delphi

  1. #1
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Billets dans le blog
    1
    Par défaut Recopier fichier ANSI vers fichier Unicode
    J'ai eu récemment à faire ce petit exercice pour un collègue aussi je pense que ça pourrait en intéresser d'autres, à savoir une fonction capable de recopier un fichier encodé en ANSI vers un fichier Unicode.

    Voici la bête :

    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
    // psFileSourceName : le nom + chemin du fichier source
    // psFileDestName : le nom + chemin du fichier destination
    // BOM : un tableau d'octets permettant d'inclure un BOM en début de fichier
    procedure FileAnsiToUnicode( const psFileSourceName, psFileDestName: String; const BOM: Array of Byte );
    var
     StreamSource, StreamDest: TMemoryStream;
     BufferSource: PChar;
     BufferSourceSize: Int64;
     BufferDest: PWideChar;
    begin
     // lire le fichier source
     StreamSource := TMemoryStream.Create;
     try
      StreamSource.LoadFromFile( psFileSourceName );
      StreamSource.Seek( 0, soFromBeginning );
      BufferSourceSize := StreamSource.Size;
      GetMem( BufferSource, BufferSourceSize );
      StreamSource.ReadBuffer( BufferSource^, BufferSourceSize );
     
     finally
      StreamSource.Free;
     end;
     
     // allouer la chaîne Unicode de destination faisant le double de la chaîne ANSI source
     // + 1 caractère pour inclure le NULL en fin de chaîne
     GetMem( BufferDest, BufferSourceSize * 2 + 1 );
     try
      // convertir l'ANSI en Unicode (string -> WideString)
      StringToWideChar( BufferSource, BufferDest, BufferSourceSize * 2 + 1 );
     
      // écrire dans le fichier de destination
      StreamDest := TMemoryStream.Create;
      try
       StreamDest.Seek( 0, soFromBeginning );
       // ajouter un BOM (Byte Order Marker) pour signaler que le fichier est Unicode
       StreamDest.WriteBuffer( BOM, SizeOf( BOM ) );
       // copier la chaîne Unicode dans la Stream de destination
       StreamDest.WriteBuffer( BufferDest^, BufferSourceSize * 2 );
       StreamDest.SaveToFile( psFileDestName );
     
      finally
       StreamDest.Free;
      end;
     
     finally
      FreeMem( BufferSource );
      FreeMem( BufferDest );
     end;
     
    end;
    Et un exemple d'utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FileAnsiToUnicode( 'MonFichierSource', 'MonFichierCible', [$FF, $FE] );
    Le code précédent inclut le BOM pour UTF-16 Little Endian mais il est également possible de ne pas inclure de BOM en passant tout simplement [] comme paramètre à la procédure.

    Je suis sûr que ce code peut être amélioré voire qu'il y ait des cas d'erreurs que je n'ai pas prévu, aussi n'hésitez pas à proposer vos améliorations ou remarques

  2. #2
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    Merci de ta participation
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

Discussions similaires

  1. Réponses: 12
    Dernier message: 19/03/2010, 18h33
  2. transfert données fichier .bat vers fichier .xls
    Par majothi dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/04/2009, 06h35
  3. fichier txt vers fichier .sql
    Par radzar dans le forum Langage SQL
    Réponses: 9
    Dernier message: 12/03/2009, 13h40
  4. fichier binaire vers fichier ascii.
    Par vbk!!! dans le forum Général Python
    Réponses: 3
    Dernier message: 24/09/2008, 12h17
  5. Ftp fichier txt vers fichier AS400
    Par marcl1 dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 09/06/2008, 13h08

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