tomap a écrit :
Salut j'aimerai savoir comment faire au juste
pour remplacer une lettre par une autre dans un fichier contenant des
caractères Unicode (caractères wide (wchar_t)).
|
On est parti pour un des sujets techniques les moins bien maitrises par le
programmeur median...
1/ wchar_t ce n'est pas necessairement de l'Unicode.
2/ que tu le lises comme une suite de caracteres etroits ou larges, un
fichier a un encodage multibyte qui depend de la locale; donc deux
caracteres differents peuvent occuper une place differente dans le fichier,
donc la seule solution portable est de copier en faisant la transformation
que tu desires, puis effacer le fichier original (ou le renommer), puis
renommer le fichier dans lequel tu as copie.
3/ s'il est envisagable d'avoir des locales qui utilisent des encodages non
variables, je n'en connais pas: les locales que je connais qui utilisent
unicode pour wchar_t utilisent UTF-8 comme encodage.
Citation :
Code :
- fseek(fichier, - sizeof(wchar_t), SEEK_CUR);
|
|
1/ Dans un fichier texte, on ne peut de maniere portable faire des
deplacements que vers des positions retournees precedemment.
2/ sizeof(wchar_t) est une constante a la compilation; meme si tu as une
locale qui utilise un encodage de taille fixe, il n'y a a priori aucun
rapport entre cette taille et sizeof(wchar_t).
el muchacho a écrit :
if( lettre == 'a')
J'ai un doute, là. lettre étant un wchar_t, m'étonnerait que ça puisse être égal à un char.
|
On est en C. 'a' est de type int (en C++ 'a' est de type char).
De plus 'x' == L'x' sauf si __STDC_BTOWC_NEQ_WCTOB__ est defini ou qu'on a
un systeme (d'office non POSIX) qui implemente la solution de DR279 mais
pas de DR321.
tpierron a écrit :
Ouais effectivement sizeof (wchar_t) est
dépendant du système. Sur Mac OS X, ça vaut 4, sur Windows ça vaut 2.
Windows utilise de l'UTF-16, qui vient en deux versions : Big endian et
little endian. Cela dit, si le fichier est créé et lu sur la même machine,
ça devrait aller.
|
Est-tu sur que les locales Windows utilise UTF-16 sur disque et pas UTF-8?
(Je ne programme pas sous Windows; et je l'utilise tres peu. Mais je sais
que Windows utilise UTF-16 en memoire pour wchar_t; ce qui ne me semble pas
conforme, un wchar_t devant etre capable de representer n'importe quel
caractere).