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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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)!

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