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
Version imprimable
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
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 :P
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- ...
Quelques corrections et precisions. Voir aussi
http://www.bourguet.org/cpp/caracteres.pdf que je devrais completer.
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.
Il y a eu des charset sur 5 bits utilises en transmission. En traitementCitation:
Au depart, les tables de caracteres consideraient un caracteres
comme etant une succession de 7, puis de 8 bits.
de l'information, longtemps c'est ceux sur 6 bits qui ont ete longtemps les
plus repandus.
"Les 128 puis 256" je supposeCitation:
Les 127, puis 128,
ASCII est un charset sur 7 bits. ASCII est la variante americaine et est aCitation:
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 :P
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.
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.
Absolument pas. C++ permet d'utiliser pas mal de charset differents (il yCitation:
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,
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).
Je connais rien a Windows.Citation:
alors que l'invite de commande windows utilise... L'UTF8 me
semble-t-il.
Il y a des charsets sur 16 bit qui n'ont aucun rapport avec Unicode. CeuxCitation:
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".
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.
ISO-8859 est sur 8 bits et n'a rien a voir avec Unicode (a part qu'UnicodeCitation:
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").
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).
Le C++ (comme le C) considere qu'il y a deux classes de charset, lesCitation:
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.
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.
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).
que des problemes d'es le début
voila un simple code qui ne marche pas
un trés mauvais début, je sais pas oû est l'erreurCode:
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
Pourquoi fais-tu un appel de fonction en dehors de toute fonction ?
De plus, main() retourne un int. Toujours.
merci
mais cette fonction ne marche pas
error C2664: '__thiscall std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> >::std::basic_string<unsigned shoCode:
1
2
3
4
5
6
7
8
9 std::wstring widen(const std::string& s) { std::wstring res(s); std::locale loc("english"); std::use_facet< std::ctype<wchar_t> >(loc).widen(&s[0], &s[s.length()], &res[0]); return res; }
rt,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> >(const class std::allocator<unsigned short> &)' : cannot convert parameter 1 from 'const class std::basic_string<char,struct std::char_traits<char>,class std::allocator
<char> >' to 'const class std::allocator<unsigned short> &'
Reason: cannot convert from 'const class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' to 'const class std::allocator<unsigned short>'
No constructor could take the source type, or constructor overload resolution was ambiguous
error C2780: 'const _F &__cdecl std::use_facet(const class std::locale &,const _F *,bool)' : expects 3 arguments - 1 provided
see declaration of 'use_facet'
en plus j'ai pas trouvé aucun site ou source sur les locales
je sais pas comment commencer
voila mon code que j'utilisai
et je sais pas quoi changer
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 #include <stdio.h> #include <string> #include <fstream> #include <iostream.h> #include <sstream> using namespace::std; void main(){ ifstream fichier("fich.txt", ios::in); if ( fichier ) { string ligne; while( getline(fichier,ligne) ) { cout<< ligne.c_str()<<endl;// il m'afficher des caractères non compréhensible }//fin while }//fin if }//fin main
J'ai pas le temps d'ecrire un tutorial sur la question. Voir par exemple:
http://www.amazon.com/Standard-IOStr...ion/0201183951
Je parie qu'en utilisant Google groups on doit trouver des choses sur comp.lang.c++.moderated.
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.