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

C++ Discussion :

Convertir un fichier unicode en ansi?


Sujet :

C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Points : 631
    Points
    631
    Par défaut Convertir un fichier unicode en ansi?
    Bonjour,

    J'ai des fichiers en unicode que j'aimerais concatener en un fichier ansi tout bete, lisible au bloc note quoi.

    Pour concatener les fichiers je fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    std::ofstream	resfile;
    std::ifstream	srcfile;
     
    // ... (on ouvre les fichiers et tout)
     
    resfile << srcfile.rdbuf();
    resfile.flush();
    Rien de bien compliqué donc.

    J'aimerais savoir si en utilisant wifstream au lieu de istream ça passe ou si c'est plus feintu ?

    Merci d'avance

    EDIT: oui je sais qu en mettant juste wifstream, ça passe pas, mais genre y a un truc simple pour faire directement fichier à fichier ou faut se faire char par char ?

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Même char par char cela risque de ne pas fonctionner.
    Pour convertir un fichier texte d'un format à un autre, on peut utiliser les locales :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    std::wofstream resfile;
    std::wifstream srcfile;
     
    resfile.imbue(std::locale("UTF-8"));
    srcfile.imbue(std::locale("UTF-16"));
     
    resfile << srcfile.rdbuf();

  3. #3
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Points : 631
    Points
    631
    Par défaut
    Bon, je fais exactement ça, j 'inclus meme <locale> mais ça me leve une exception a chaque fois, c'est un peu relou

    Et puis locale ça sert a convertir ou a dire dans quel format c'est ?

    Je suis désolé, mais vraiment je vois pas pour le coup la, alors merci d'avance.

  4. #4
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Points : 631
    Points
    631
    Par défaut
    Bon, je n'arrive vraiment pas à faire ce que je veux.

    En fait, j'ai eu la mauvaise idée de faire un outil avec les "form" de visual..

    Entre autres choses, cet outil doit lister et concatener des fichiers en un seul.
    Il se trouve que certains de ces fichiers sont en unicode. Et les fichiers résultats doivent être en code normal, ansi tout bete, du genre qu'on trouve quand on ouvre un bloc note.

    J'ai essayé d'utiliser les locales, comme dit dans le message plus haut, mais ça me leve des exceptions à tous les coups. En plus je n'ai trouvé nulle part de doc précise du truc, donnant par exemple la liste des chaines pouvant etre passées en parametre sans tout faire sauter.

    J'ai aussi tenté d'utiliser les fonctions narrow et widen vues ici mais ça ne compile pas : quand on déclare std::string res(ws), ws étant une std::wstring&, ça me pete l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    error C2664: 'std::basic_string<_Elem,_Traits,_Ax>::basic_string(const std::basic_string<_Elem,_Traits,_Ax>::_Alloc &)' : impossible de convertir le paramètre 1 de 'const std::string' en 'const std::basic_string<_Elem,_Traits,_Ax>::_Alloc &'
            with
            [
                _Elem=wchar_t,
                _Traits=std::char_traits<wchar_t>,
                _Ax=std::allocator<wchar_t>
            ]
            and
            [
                _Elem=wchar_t,
                _Traits=std::char_traits<wchar_t>,
                _Ax=std::allocator<wchar_t>
            ]
    Je ne peux pas non plus utiliser les CString, vu que sous win rien n'est compatible (trop facile sinon). Et c'est dommage parce que j'avais trouvé comment transformer des CString contenant de l'unicode en std::string contenant de l'ansi avec la fonction widechartomultibyte ou l'inverse.

    Donc, est ce que qqun connaitrait une lib qui convertit un fichier unicode en fichier ansi directement ?
    Ou alors comment je peux, avec les moyens tellement limités que m'offre cette saleté de programmation windows form, faire en sorte que je puisse arriver à mon résultat ? N'importe quelle idée serait la bienvenue.

    Merci d'avance.

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    je te conseillerais d'utiliser iconv
    il peut convertir un fichier d'une locale vers une autre
    avec meme l'option de faire le maximum dans le cas ou le caratere n'existerait pas (ex: à -> `a)

    voila a+

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Un fichier en unicode ça ne veut pas dire grand chose. Unicode est une table de caractères, pas un format de fichier.

    Sous Windows, il est probable que ce que tu appelle des fichiers unicode soit de l'UTF-16LE, et que tu veuilles les convertir en windows-1252.

    Sans les locales (c'est vrai qu'elles sont mal-documentées), une solution spécifique à Windows serait de lire le contenu (binaire) du fichier source dans un buffer en mémoire, d'appeler la fonction WideCharToMultiByte avec les bons paramètres, puis d'écrire le résultat (binaire) dans le fichier de destination.

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    humm je pense iconv est la meilleure et la plus simple solution

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    ca a marché ?
    encore des problemes ?
    ca serait bien de donner un petit status pour au moins avoir un petit retour d'experience

    Merci a+

Discussions similaires

  1. Convertir un fichier UTF16 en Ansi sous python
    Par assoum27 dans le forum Général Python
    Réponses: 8
    Dernier message: 26/12/2012, 17h55
  2. Convertir fichier UTF8 en ANSI
    Par Trunks dans le forum C++
    Réponses: 15
    Dernier message: 04/12/2008, 11h52
  3. Recopier fichier ANSI vers fichier Unicode
    Par Aka Guymelef dans le forum Contribuez
    Réponses: 1
    Dernier message: 17/03/2008, 14h51
  4. convertir un fichier texte en ANSI
    Par sculpteur dans le forum Scripts/Batch
    Réponses: 6
    Dernier message: 08/10/2007, 12h38
  5. Convertir un fichier texte de OEM vers ANSI
    Par paix02200 dans le forum VBA Access
    Réponses: 1
    Dernier message: 20/08/2007, 16h15

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