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 :

écriture dans un fichier


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif
    Inscrit en
    Novembre 2007
    Messages
    369
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 369
    Par défaut écriture dans un fichier
    bonjour,
    je voudrai savoir comment écrire des caracteres non latin(par exemple russe ou autres langue) dans un fichier texte
    qu'est ce que je doit connaitre ?
    j'utilise vs2005 (c++)
    merci

  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, et bienvenue sur le forum.

    Bon, pour essayer de donner une réponse cohérente, on peut commencer par te parler de ce qui s'appelle les "tables de caractères"...

    Les "tables de caractères" sont, on s'en serait douté, des tables qui font la corrélation entre les valeurs et les caractères qui doivent être afficher lorsque ces valeurs sont à considérer comme... caractères.

    Au départ, les tables de caractères considéraient un caractères comme étant une succession de 7, puis de 8 bits.

    Les 127, puis 128, caractères possibles étaient suffisant pour représenter tous les caractères usuels en anglais - ou même en français - mais ne sont vraiment pas suffisant pour permettre la représentation de tous les caractères de toutes les langues

    Il existe d'ailleurs plusieurs tables de caractères codées sur 8 bits, dont, les plus couramment citées sont la table ASCII, la table OCBD et l'UTF8.

    Il est d'ailleurs intéressant de noter qu'il y a quelques différences de tailles entre ces différentes tables, et que, en dehors de toutes indication contraire, le C++ utilise de préférence la table ASCII, alors que l'invite de commande windows utilise... L'UTF8 me semble-t-il.

    Comme il fallait plus de possibilités pour pouvoir représenter tous les caractères, il n'a pas été long avant que l'on ne voie apparaitre des tables de caractères codés sur ... 16 bits, et qui sont connues sous le terme de "unicode".

    Parmi celle-ci, on trouve, entre autres, celles de la norme ISO-8859, et les tables bien connues ISO-8859-1 (français sans signe "euro") et ISO-8859-15 (français avec signe "EURO").

    Par défaut, le C++ considère que les caractères sont codés sur 8 bits (en tout cas pour le type "char").

    Cependant, il propose aussi un type de caractères codé sur 16: le type wchar_t.

    Il faut savoir que tout ce qui permet de gérer l'affichage et l'utilisation de caracètres (std::string, std::*stream, std::*stringstream, std::*fstream,...) n'est jamais que spécialisation de classe "template", et qu'il existe donc une spécialisation - généralement utilisée - pour les caractères "8 bits", et une autre pour les caractères "16 bits".

    Pour les deuxième, il suffit généralement de rajouter un "w" dans le nom de la classe (ce qui donne std::wstring, std::w*stringsream, std::w*fstream et std::w*stream).

    Cependant, pour pouvoir les utiliser pleinement, il faut *aussi* être en mesure de savoir quelle table de caractères utiliser.

    Le fichier d'inclusion <locale> et les méthodes qui s'y rapportent sont généralement suffisantes.

    Voilà pour ce qui est de la théorie générale à connaitre, et tu trouvera également au moins une entrée sur la conversion ASCII-->unicode dans la FAQ

    Pour le reste, désolé, mais comme j'utilise rarement le codage unicode - et encore moins souvent la police de caractères russe- ...
    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
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Quelques corrections et precisions. Voir aussi
    http://www.bourguet.org/cpp/caracteres.pdf que je devrais completer.

    Citation Envoyé par koala01 Voir le message
    Salut, et bienvenue sur le forum.

    Bon, pour essayer de donner une reponse coherente, on peut commencer par te
    parler de ce qui s'appelle les "tables de caracteres"...

    Les "tables de caracteres" sont, on s'en serait doute, des tables qui font
    la correlation entre les valeurs et les caracteres qui doivent \x{00EA}tre
    afficher lorsque ces valeurs sont a considerer comme... caracteres.
    Jamais entendu tables de caracteres dans ce sens. J'ai plutot entendu: jeu
    de caracteres codes (coded character set), codeset, charset, codepage. Je
    me demande si ta table de caracteres n'est pas une tentative de traduction
    du dernier terme.

    Au depart, les tables de caracteres consideraient un caracteres
    comme etant une succession de 7, puis de 8 bits.
    Il y a eu des charset sur 5 bits utilises en transmission. En traitement
    de l'information, longtemps c'est ceux sur 6 bits qui ont ete longtemps les
    plus repandus.

    Les 127, puis 128,
    "Les 128 puis 256" je suppose

    caracteres possibles etaient suffisant pour representer tous les
    caracteres usuels en anglais - ou meme en francais - mais ne sont vraiment
    pas suffisant pour permettre la representation de tous les caracteres de
    toutes les langues

    Il existe d'ailleurs plusieurs tables de caracteres codees sur 8 bits,
    dont, les plus couramment citees sont la table ASCII, la table OCBD et
    l'UTF8.
    ASCII est un charset sur 7 bits. ASCII est la variante americaine et est a
    la base de la famille de charset 7 bits ISO-646 (qui a des variantes
    nationnales qui remplace certains caracteres de l'ASCII par d'autres -- des
    lettres accentuees pour le francais -- et regles de combinaisons --
    permettant de fabriquer les lettres accentuees manquantes par combinaison
    de 3 caracteres).

    Tant qu'on y est, ISO-8859 est une famille de charsets sur 8 bits dont les
    128 premiers caracteres sont ceux de l'ASCII.

    OCDB je ne connais pas (google ne trouve apparemment rien d'interessant),
    confusion avec EBCDIC, une famille de charset sur 8 bits?

    UTF8 n'est pas un charset mais un encodage (une maniere de representer
    physiquement un charset) d'Unicode. Qui est un charset sur 20-21 bits.

    Il est d'ailleurs interessant de noter qu'il y a quelques
    differences de tailles entre ces differentes tables, et que, en dehors de
    toutes indication contraire, le C++ utilise de preference la table
    ASCII,
    Absolument pas. C++ permet d'utiliser pas mal de charset differents (il y
    a quelques contraintes, la plus grosse etant que tous les charset supportes
    par une implementation doivent avoir le codage d'un certain nombre de
    caracteres en commun).

    alors que l'invite de commande windows utilise... L'UTF8 me
    semble-t-il.
    Je connais rien a Windows.

    Comme il fallait plus de possibilites pour pouvoir representer tous
    les caracteres, il n'a pas ete long avant que l'on ne voie apparaitre des
    tables de caracteres codes sur ... 16 bits, et qui sont connues sous le
    terme de "unicode".
    Il y a des charsets sur 16 bit qui n'ont aucun rapport avec Unicode. Ceux
    que je connais sont utilises pour les langues a ideogrammes (Chinois,
    Japonais, Koreen).

    ISO-10646 est une tentative de batir un charset universel. Au depart sur
    32 ou 31 bits. Les 256 premiers caracteres sont ceux d'ISO-8859-1.

    Unicode est une projet d'ajouter au charset de ISO-10646 des informations
    semantiques (unification, classement, algo bidirectionnel...). Au depart
    Unicode se limitait au premier plan (16 bits). Unicode definit aussi un
    certain nombre de codage, dont un codage utilisant des entites de 8 bits
    (UTF-8) et un utilisant des unites de 16 bits (UTF-16).

    Il y a de la concertation entre ces projets, et ISO-10646 a decide de se
    limiter aux points de codage qu'il est possible d'encoder avec UTF-16, les
    20-21 bits que je citais ci-dessus.

    Parmi celle-ci, on trouve, entre autres, celles de la norme
    ISO-8859, et les tables bien connues ISO-8859-1 (francais sans signe
    "euro") et ISO-8859-15 (francais avec signe "EURO").
    ISO-8859 est sur 8 bits et n'a rien a voir avec Unicode (a part qu'Unicode
    reprend les 256 premiers caracteres de ISO-8859-1). ISO-8859-1 n'a pas
    certains caracteres necessaires pour le francais: ligatures oe OE et le Y
    trema majuscule. Ils ont ete ajoute dans ISO-8859-15. Au fait une partie
    des charset ISO-8859 sont aussi connu sous les noms ISO-Latin (ISO-8859-1
    est ISO-Latin-1 et ISO-8859-15 ISO-Latin-9).

    Par defaut, le C++ considere que les caracteres sont codes sur 8
    bits (en tout cas pour le type "char").

    Cependant, il propose aussi un type de caracteres code sur 16: le type
    wchar_t.
    Le C++ (comme le C) considere qu'il y a deux classes de charset, les
    etroits dont tous les points de codage tiennent dans un char. Un char doit
    faire 8 bits au minimum, mais des implementations utilisent plus pour des
    raisons qui n'ont rien a voir avec la gestion des caracteres mais avec
    d'autres contraintes que le C et C++ mettent sur les char.

    Les "larges", dont tous les points de codage tiennent dans un wchar_t qui
    aussi doit faire 8 bits minimum.

    Formellement, si unicode est un charsets supporte, il faut que wchar_t
    fasse au moins 21 bits. Mais ce n'est pas deraisonnable (considerant
    l'historique d'Unicode qui au depart avait promis de ne pas depasser 16
    bits, considerant la presence de toute maniere de caracteres combinants
    d'unicode, considerant la rarete en dehors de certains domaines des
    caracteres hors du premier plan) d'utiliser 16 bits avec UTF-16 comme
    encodage.

    Desoles, gueres de renseignements pratiques. J'espere juste te permettre
    de suivre les doc plus facilement en donnant une meilleure comprehension du contexte.

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par koala01 Voir le message
    l'invite de commande windows utilise... L'UTF8 me semble-t-il.
    Remarque : propos sujet à caution : C'est assez mal documenté, et ça varie en fonction des versions, et ce n'est pas trop mon domaine...

    Windows utilise en interne un codage 16 bits (UCS-2 puis UTF-16, à ce que j'ai compris), mais fournis aussi pour compatibilité des API utilisant desMBCS (multi byte character string), qui bien qu'ayant des principes proches de l'UTF8 n'en sont pas. Je n'ai pas vraiment réussi à en savoir plus sur ce codage, et en particulier j'ai pu avoir l'impression qu'il dépend des préférences linguistiques de l'utilisateur, cherchant à coder en 8 bits les éléments qui sont courants dans sa langue.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par fatjoe Voir le message
    bonjour,
    je voudrai savoir comment écrire des caracteres non latin(par exemple russe ou autres langue) dans un fichier texte
    qu'est ce que je doit connaitre ?
    j'utilise vs2005 (c++)
    merci
    Pour etre clair, le principe est bien d'utiliser les "locale" dont Koala a fait mention.

  6. #6
    Inactif
    Inscrit en
    Novembre 2007
    Messages
    369
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 369
    Par défaut
    alors je doit utiliser unicode?

  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
    Citation Envoyé par fatjoe Voir le message
    alors je doit utiliser unicode?
    Tu dois utiliser une locale adaptée aux langues que tu veux utiliser. S'il y en a plusieurs avec des alphabets non latin, il y a de bonne chance qu'il faille utiliser une locale utilisant unicode comme charset.

    A partir du moment où on sait comment changer la locale pour son système (et là je ne sais pas t'aider), c'est relativement simple (un appel au début du programme suffit pour bien des choses).

  8. #8
    Inactif
    Inscrit en
    Novembre 2007
    Messages
    369
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 369
    Par défaut
    que des problemes d'es le début
    voila un simple code qui ne marche pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include <stdio.h>
    #include <string>
    #include <locale>
    setlocale (LC_CTYPE, "de_DE");
    void main()
    {}
    error C2501: 'setlocale' : missing storage-class or type specifiers
    error C2373: 'setlocale' : redefinition; different type modifiers
    see declaration of 'setlocale'
    error C2078: too many initializers
    error C2440: 'initializing' : cannot convert from 'char [1]' to 'int'
            This conversion requires a reinterpret_cast, a C-style cast or function-style cast
    un trés mauvais début, je sais pas oû est l'erreur

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Pourquoi fais-tu un appel de fonction en dehors de toute fonction ?

    De plus, main() retourne un int. Toujours.
    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.

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/08/2005, 11h57
  2. [PERL] Problème lecture/écriture dans un fichier
    Par LE NEINDRE dans le forum Langage
    Réponses: 4
    Dernier message: 17/08/2005, 13h15
  3. Problème d'écriture dans un fichier xml
    Par vanoou dans le forum C++Builder
    Réponses: 1
    Dernier message: 13/07/2005, 02h28
  4. Passer à la ligne lors de l'écriture dans un fichier
    Par hams dans le forum Assembleur
    Réponses: 4
    Dernier message: 17/04/2005, 19h25
  5. [JUnit] Junit écriture dans un fichier
    Par mikael35 dans le forum Tests et Performance
    Réponses: 1
    Dernier message: 10/08/2004, 13h11

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