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 :

Conversion Fichier Ascii vers Unicode (et Unicode vers Ascii)


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2014
    Messages : 8
    Points : 1
    Points
    1
    Par défaut Conversion Fichier Ascii vers Unicode (et Unicode vers Ascii)
    Bonjour,

    Après avoir effectuer de nombreuses recherches sur le sujet, je me suis inscrit sur ce forum pour demander votre aide.
    Mon besoin est le suivant : Convertir un fichier Unicode vers un format classique Ascii, effectuer des modification sur le fichier et finalement, reconvertir le fichier Ascii vers un format Unicode.

    Actuellement je le fais avec un VBS, malheureusement, pour des soucis d'optimisation de temps (je travail sur des fichiers très lourds) je souhaitais l'écrire en langage compilé.

    Les quelques propositions sur internet, autour de ce sujet, ne m'ont pas permis d'aboutir à un résultat viable. Peut-etre ai-je mal adapté les codes fournis ... même l'aide de Microsoft sur le sujet n'a pas pu m'aider.

    Le codage en C++ n'est pas une fin en soit pour le développement mais serait un plus pour la suite de mon programme.

    Merci d'avance, en espérant que vous pourrez m'aider à résoudre mon problème.

    Cordialement.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Une des questions à garder à l'esprit, c'est: Quelle est la consigne quant aux caractères qui ne sont pas dans l'ASCII? Les jeter? Les remplacer par un caractère spécial, toujours le même (souvent un point ou point d'interrogation) ? Tenter d'y substituer des caractères proches (ex: transformer é en e) ?
    À différents besoins correspondent différentes possibilités, et certaines options sont plus faciles que d'autres.

    Edit: Autre question: Quel format Unicode? Sans autre information, je subodore que tu parles d'UCS-2 ou UTF-16? En gros, caractères sur 16 bits, probablement en little-endian?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2014
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Tout d'abord, merci pour votre réponse rapide.

    En effet, il s'agit "probablement" de little-endian (la conversion est "propre" via notepad++).
    A priori, il n'y a pas d'accent dans le fichier. S'il y-en a c'est a l'utilisateur de le corriger et non pas au programme.

    Cordialement.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Dans ce cas, tu peux directement faire de la lecture binaire vers un tableau de unsigned short, copier en castant vers un tableau de char (en crachant une erreur pour toute valeur non-comprise entre 0 et 127 inclus), puis faire ton boulot dessus.

    Pour ne pas charger tout le fichier UCS-2 en mémoire, il peut être une bonne idée de faire la lecture avec une boucle, et utiliser un buffer de unsigned short relativement petit par rapport à la vraie destination.


    Et pour réécrire le fichier, faire la même chose en sens inverse: Remplir le buffer de unsigned short en castant, puis écriture binaire.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2014
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Je pense avoir compris la méthode pour le passage Unicode -> Ascii. Identifier les caractère du fichier par leur identifiant binaire et garder ceux inférieurs à 127.
    Il s'agit donc de supprimer des caractères, en revanche pour le passage vers l'Unicode, il va falloir ajouter de nouveaux caractères et auquel cas lesquels ?

    Merci pour votre aide, cordialement.

    EDIT : N'existe t'il pas des fonctions déjà toutes faites en chargeant une certaine librairie sinon ?

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Pour convertir de l'ASCII vers l'UTF-16, il n'y a rien à ajouter, à moins que tu veuilles trouver un moyen de "restaurer" les caractères qui avaient été supprimés lors de la conversion vers ASCII (bonne chance). Pour convertir de l'ASCII vers l'UTF-16, il suffit de caster chaque char en unsigned short: tous les codes ASCII (0-127) sont des codes UTF-16 valides.


    Il y a déjà des fonctions en effet: Certaines en C standard (mais pas vraiment spécifiques à ASCII et UTF-16), et d'autres dans l'API Windows: MultiByteToWideChar() convertit vers l'UTF-16, et WideCharToMultiByte() convertit depuis l'UTF-16 vers divers encodages, dont ASCII pur (Page de codes 20127) (et en plus, à moins que tu passes un flag pour le refuser, elles font la substitution pour les caractères qui n'existent pas dans l'encodage de destination (ici, les caractères non-ASCII).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2014
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Merci pour ta réponse.

    Je vais aller jeter un oeil du coté des fonctions déjà codées, et sinon essayer de développer une routine tout seul.
    Merci encore, je te tiens au courrant si j'ai d'autres problèmes.

    Cordialement.

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2014
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    J'ai récupérer des lignes de codes sur internet qui semblaient être pas mal, finalement je tourne en rond je n'arrive pas à faire ce que je souhaite.
    Voici le bout de code :

    -----------------------------------------------
    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
     
    #include <iostream>
    #include <fstream>
    #include <stdio.h>
    #include <string.h>
    #include <windows.h>
    #include <wchar.h>
    #include <malloc.h>
     
    using namespace std;
     
    // Convert a wide Unicode string to an UTF8 string
    std::string utf8_encode(const std::wstring &wstr)
    {
        int size_needed = WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), NULL, 0, NULL, NULL);
        std::string strTo( size_needed, 0 );
        WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), &strTo[0], size_needed, NULL, NULL);
        return strTo;
    }
     
    // Convert an UTF8 string to a wide Unicode String
    std::wstring utf8_decode(const std::string &str)
    {
        int size_needed = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0);
        std::wstring wstrTo( size_needed, 0 );
        MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed);
        return wstrTo;
    }
     
    int main(int argc, char *argv[])
        {
        wstring wligne;
        wifstream fp("fichier_UTF-16LE.tof");
        getline(fp,wligne);
        wcout << wligne <<endl;
        string ligne;
        ligne=utf8_encode(wligne);
        cout << ligne <<endl;
     
        fp.close();
        return 0;
    }
    -----------------------------------------------

    Voila, donc apparement ca convertie bien les chaines entre string et wstring, mais les chaines restent toujours inexploitables en raison des caractères nuls entre deux bons.

    Au cas où ca ne se voyait pas, je ne suis pas un expert en la matière

    Cordialement.

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), &strTo[0], size_needed, NULL, NULL);
    Wow, je pensais que c'était une "extension" de Microsoft, mais d'après le standard, c'est garanti donner une référence non-const. Je vais pouvoir modifier mon code pour l'optimiser...
    Mais il faut faire gaffe, parce qu'il me semble que le standard ne garantit pas que le buffer se termine par un caractère nul (c'est la différence entre &str[0] et str.c_str(); il faut donc allouer explicitement de la place pour ce caractère nul, puis l'exclure explicitement de la chaîne...

    Edit1+2: Non, d'après la norme avant C++11 c'est un comportement indéfini: On peut modifier un caractère individuellement, mais pas jouer aux pointeurs. Même si en pratique sous Windows ça marche.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2014
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Bon alors, résultat des courses.

    J'ai recopier le code VBS dans Visual Studio, l'ai compilé à partir d'un VB.NET et ...

    L'éxécutable est 3-4 fois plus lent que le VBS, j'ai loupé un épisode je crois là ...

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    On peut voir le VBS?

    Edit: Ou plutôt le code VB.Net?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2014
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Désolé pour l'attente, voici le VBS de la conversion.
    Il marche très bien mais un peu long sur les gros fichiers, le VB.NET est identique sauf au niveau de l'appel des arguments.

    Code VB : 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
     
     
    ' Convert Unicode to Ascii
     
    Set Arg=WScript.Arguments
     
    Const ForReading = 1, ForWriting = 2, ForAppending = 8
    Const ModeAscii = 0, ModeUnicode = -1
    Dim fso, f_in, f_out
     
    Set fso = CreateObject("Scripting.FileSystemObject" )
     
    Set f_in = fso.OpenTextFile(Arg(0), ForReading,, ModeUnicode)
    Set f_out = fso.OpenTextFile(Arg(1), ForWriting, true, ModeAscii)
     
    Do Until f_in.AtEndOfStream
       f_out.Write f_in.Read(1)
    Loop
     
    f_in.Close
    f_out.Close

    Cordialement.

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ah, si tu utilises un FileSystemObject, c'est normal que ce soit plus lent en .Net, vu qu'il faut faire les transitions entre .Net et COM (alors que VBS est dédié à COM).

    Si tu passes en VB.Net, le code sera plus rapide en utilisant des System.IO.StreamReader et System.IO.StreamWriter...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2014
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    En effet, a priori ca a l'air de bien marcher. J'effectue quelques tests et je poste le code VB.NET ici. En revanche je suis toujours coincé pour la conversion en C++ :S

    Merci en tout cas, mon programme va gagner beaucoup de temps.

    EDIT : Voici le code VB.NET

    Code VB : 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
     
    Imports System
    Imports System.IO
    Imports System.Collections
     
    Module Module1
     
        Sub Main()
     
            ' Convert Unicode to Ascii
     
            Dim args() As String
            args = Split(Command(), " ")
     
            Dim f_in As New StreamReader(args(0), System.Text.Encoding.Unicode)
            Dim fs As FileStream = New FileStream(args(1), FileMode.CreateNew)
            Dim f_out As StreamWriter = New StreamWriter(fs, System.Text.Encoding.Default)
     
            Do Until f_in.EndOfStream
                f_out.WriteLine(f_in.ReadLine())
            Loop
     
            f_in.Close()
            f_out.Close()
     
        End Sub
     
    End Module

Discussions similaires

  1. [phpMyAdmin] Conversion fichier MYD vers SQL.
    Par je-suis-moi dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 19/06/2009, 23h09
  2. Probleme conversion fichier provenant d'une base oracle vers une base mysql
    Par jonnyboy dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 18/06/2009, 09h40
  3. Conversion fichiers Clarion vers Hyperfile
    Par avc19 dans le forum HyperFileSQL
    Réponses: 3
    Dernier message: 31/03/2009, 17h04
  4. conversion fichier vers .HLP
    Par kadis500 dans le forum C++Builder
    Réponses: 3
    Dernier message: 22/05/2008, 16h15
  5. Conversion fichier plat vers CSV
    Par linar009 dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 23/11/2006, 13h35

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