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 :

problème page de codes


Sujet :

C++

  1. #1
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut problème page de codes
    Salut,

    Avec linux je récupère un fichier dBase issu de Windows que je dois traiter en C++ avec Linux.

    Malheureusement il est codé dans une page de code ( ibm850) qui me pose des problèmes de traduction lorsque je l'exporte étant en UTF8.

    Comment puis procéder à la traduction de ibm850 vers utf8 ?

    J'ai entendu parler de locale en C et C++, un peu compliqué, je n'y comprends pas grand chose.

    Si vous avez une idée ...

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Une rapide recherche sur google m'a permis de trouver une commande sous linux qui devrait te servir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    convmv --notest -r -f cp850 -t utf8 nom_du_fichier
    Pour infos: man convmv
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Salut,

    Merçi Koala01. J'ai testé cette commande mais elle ne semble agir que sur les noms de fichiers pas sur leurs contenus.

    Le problème serait solvable si je disposais des valeurs hexa de ibm850 et utf8 .

    Je vais faire une recherche...

  4. #4
    Membre émérite

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Les locales sont assez compliquées, en effet, et c'est pas dit que tu ai la bonne locale d'installée.

    En C++ je ferait quelque chose comme ça (pas testé)
    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
    void writeIbm850Char(std::ostream& dst, unsigned char c)
    {
      if (c < 128)
      {
        dst.put(c); // ascii
      }
      else
      {
        static int const table[128] = {
          0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7,
          0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5,
          0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9,
          0x00ff, 0x00d6, 0x00dc, 0x00f8, 0x00a3, 0x00d8, 0x00d7, 0x0192,
          0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba,
          0x00bf, 0x00ae, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb,
          0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00c1, 0x00c2, 0x00c0,
          0x00a9, 0x2563, 0x2551, 0x2557, 0x255d, 0x00a2, 0x00a5, 0x2510,
          0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x00e3, 0x00c3,
          0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x00a4,
          0x00f0, 0x00d0, 0x00ca, 0x00cb, 0x00c8, 0x0131, 0x00cd, 0x00ce,
          0x00cf, 0x2518, 0x250c, 0x2588, 0x2584, 0x00a6, 0x00cc, 0x2580,
          0x00d3, 0x00df, 0x00d4, 0x00d2, 0x00f5, 0x00d5, 0x00b5, 0x00fe,
          0x00de, 0x00da, 0x00db, 0x00d9, 0x00fd, 0x00dd, 0x00af, 0x00b4,
          0x00ad, 0x00b1, 0x2017, 0x00be, 0x00b6, 0x00a7, 0x00f7, 0x00b8,
          0x00b0, 0x00a8, 0x00b7, 0x00b9, 0x00b3, 0x00b2, 0x25a0, 0x00a0
        };
        int unicode = table[c - 128];
        if (unicode <= 0x07FF)
        {	
          dst.put(0xC0 | (unicode >> 6));
          dst.put(0x80 | (unicode & 0x3F));
        }
        else // unicode <= 0xFFFF
        {
          dst.put(0xE0 | (unicode >> 12));
          dst.put(0x80 | ((unicode >> 6) & 0x3F));
          dst.put(0x80 | (unicode & 0x3F));
        }
      }
    }

  5. #5
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Salut,

    Je vais tenter la solution de Sylvain, qui permet une implémentation de la traduction de ibm850 vers utf8.
    Je viens de faire une recherche sur utf8, effectivement le codage implique une manipulation de bits jusque sur 4 octets.

    Il y a la commande iconv de linux qui est impeccable à utiliser uniquement sur des fichiers textes.

    On peut exporter le dBase avec ses caractères ibm850. Puis le vider. Ensuite convertir l'exportation en utf8 avec iconv. Et ensuite réimporter la conversion dans le dBase.

    C'est pas très malin. Pour les locale en C et C++, il y a trop peu de documentation et d'exemples pour faire quoique ce soit à mon avis

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 11
    Par défaut Pour semer le doute...
    Sauf spécification suffixe contraire, les nombres isolés (hors url...) sont en hexadécimal
    fr.wikipedia.org et en.wikipedia.org ne sont pas d'accord!
    http://fr.wikipedia.org/wiki/Page_de_code_850
    http://en.wikipedia.org/wiki/Code_page_850

    Le doute plane sur les caractères DD et DE de la page 850d.
    page 850d / unicode selon wiki_en / unicode selon wiki_fr
    DD / 258C / A6
    DE / 2590 / CC

    J'ai tendance à faire plus confiance à en.wikipedia.org mais il faudrait trouver d'autres sources fiables en espérant que celles-ci n'ont pas utilisé wikipedia comme référence!...

    Conversion DOS -> unicode (dans le BPM) -> utf8
    Pour plus de sureté, j'utiliserais unsigned long int pour travailler sur 16d bits et non 15d bits. Mais cela ne semble pas important dans le problème ici.
    Remarque, pour une conversion totale entre unicode (<11h*10000h) et utf8,
    il faut ajouter une dernière clause au if mais alors aussi utiliser un format sur 32d bits.

    PS: Les caractères 00 à 1F ainsi que 7F sont des codes de contrôle qui ont le même équivalent en unicode même s'ils sont habituellement représentés par un caractère imprimable (en.wikipedia.org)!

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    ftp://ftp.unicode.org/Public/MAPPING...T/PC/CP850.TXT
    donne
    0xdd 0x00a6 #BROKEN BAR
    0xde 0x00cc #LATIN CAPITAL LETTER I WITH GRAVE

  8. #8
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Salut,

    Apparemment pour coder le Français avec Ansi , on peut se servir de cp850 comme de cp437 même d'autres ?

    Le problème c'est que les indices dans les tables de caractères varient.

    J'ai repris la solution de Sylvain, en remplaçant ostream, par ostringstream pour convertir à la volée les lignes lues depuis mes dBase. Cela fonctionne très bien.

    Question à Sylvain :

    Comment êtes-vous parvenu à cette table :
    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
     
    static int const table[128] = {
          0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7,
          0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5,
          0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9,
          0x00ff, 0x00d6, 0x00dc, 0x00f8, 0x00a3, 0x00d8, 0x00d7, 0x0192,
          0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba,
          0x00bf, 0x00ae, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb,
          0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00c1, 0x00c2, 0x00c0,
          0x00a9, 0x2563, 0x2551, 0x2557, 0x255d, 0x00a2, 0x00a5, 0x2510,
          0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x00e3, 0x00c3,
          0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x00a4,
          0x00f0, 0x00d0, 0x00ca, 0x00cb, 0x00c8, 0x0131, 0x00cd, 0x00ce,
          0x00cf, 0x2518, 0x250c, 0x2588, 0x2584, 0x00a6, 0x00cc, 0x2580,
          0x00d3, 0x00df, 0x00d4, 0x00d2, 0x00f5, 0x00d5, 0x00b5, 0x00fe,
          0x00de, 0x00da, 0x00db, 0x00d9, 0x00fd, 0x00dd, 0x00af, 0x00b4,
          0x00ad, 0x00b1, 0x2017, 0x00be, 0x00b6, 0x00a7, 0x00f7, 0x00b8,
          0x00b0, 0x00a8, 0x00b7, 0x00b9, 0x00b3, 0x00b2, 0x25a0, 0x00a0
        };
    que je n'aurais jamais pu trouver ?

  9. #9
    Membre émérite

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Citation Envoyé par dj.motte
    Apparemment pour coder le Français avec Ansi , on peut se servir de cp850 comme de cp437 même d'autres ?
    Oui, il existe beaucoup de tables qui ont les charactères nécessaires au français, mais beaucoup sont vielles et peu utilisées. En pratique, on utilisera ISO8859 ou UTF-8 sous UNIX et CP1252 ou UTF-16 sous Windows.

    Le problème c'est que les indices dans les tables de caractères varient.
    Effectivement

    Comment êtes-vous parvenu à cette table :
    C'est les 128 derniers codes unicodes de cp850, les 128 premiers, comme dans beaucoup de tables, correspondent à l'ASCII. Ils sont trouvables un peu partout sur le net, voir par exemple le lien ci-dessus donné par Jean-Marc.

Discussions similaires

  1. Problème de page de code
    Par baloub dans le forum VB.NET
    Réponses: 2
    Dernier message: 13/03/2011, 15h20
  2. Problème de page de code
    Par dj.motte dans le forum Qt
    Réponses: 9
    Dernier message: 26/03/2008, 16h09
  3. Problème de page de code
    Par dj.motte dans le forum Firebird
    Réponses: 1
    Dernier message: 15/01/2008, 22h31
  4. [Batch NT]Pb de page de code
    Par Laurent Dardenne dans le forum Windows
    Réponses: 7
    Dernier message: 17/08/2005, 15h52
  5. Quel est le problème dans ce code ?
    Par Luther13 dans le forum C
    Réponses: 12
    Dernier message: 26/08/2003, 16h09

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