Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2332 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Remplacer une lettre wchar_t par une autre dans un fichier. (Unicode)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Remplacer une lettre wchar_t par une autre dans un fichier. (Unicode)

n°1869660
tomap
Posté le 05-04-2009 à 14:06:10  profilanswer
 

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)).
J'ai essayer avec le code suivant, mais ça ne marche pas, je tombe a chaque fois dans une boucle infinie:

Code :
  1. do
  2. {
  3.    lettre = fgetwc(fichier);
  4.    //printf("%d\n", debug++);
  5.    if( lettre == 'a')
  6.    {
  7.       //puts("OK" );
  8.       fseek(fichier, - sizeof(wchar_t), SEEK_CUR);
  9.       fputwc('b', fichier);
  10.    }
  11. }
  12. while(lettre != WEOF);


Le plus bizarre c'est que ftell() retourne 17 avant fseek() et elle retourne 0 après fseek() !
Merci.

mood
Publicité
Posté le 05-04-2009 à 14:06:10  profilanswer
 

n°1870825
el muchach​o
Comfortably Numb
Posté le 07-04-2009 à 22:31:39  profilanswer
 

if( lettre == 'a')
 
J'ai un doute, là. lettre étant un wchar_t, m'étonnerait que ça puisse être égal à un char.


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°1870833
tpierron
Posté le 07-04-2009 à 23:16:54  profilanswer
 

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.
 
Bref, faut faire attention à ce que tu lis. Mets un printf pour voir si c'est bien le code ascii du 'a' que tu récupères et pas une valeur déformée par l'endianess.
 
C'est pour ça que je préfère l'UTF-8, pas besoin de ce prendre la tête avec ce genre de détails.

n°1870865
Un Program​meur
Posté le 08-04-2009 à 08:49:58  profilanswer
 

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 :
  1. 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).

n°1872133
tomap
Posté le 10-04-2009 à 17:50:01  profilanswer
 

Je compile sous Linux, ma locale est en UTF-8, et les caractères que je manipule sont en fait des caractères arabes. le 'a' et le 'b' ( ou disant L'a' et L'b' ) c'était juste pour l'exemple.
Donc à ce que je vois, vu que en UTF-8 la longueur est variable d'un caractère à un autre , la seule manière de faire ça sans problème est de copier lettre par lettre dans un autre fichier, puis le renommer..


Message édité par tomap le 10-04-2009 à 17:52:00
n°1872154
Un Program​meur
Posté le 10-04-2009 à 20:51:23  profilanswer
 

Exact.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Remplacer une lettre wchar_t par une autre dans un fichier. (Unicode)

 

Sujets relatifs
Fichier de police en jaasAfficher un caractère unicode sous internet exploreur ?
importer des tables à partir d'un fichier texteeregi_replace(),remplacer ce qui n'est pas alphanum' sauf le point (.)
En-tête de fichier csv[Réglé]Test à l'accès d'un fichier (savoir s'il est déjà ouvert)
Load incomplet au 1er chargement de la page avec fichier XML[Shell] Remplacer des infos dans un fichier
Création macro pour un fichier Excel de 600p et 13000 lignes 
Plus de sujets relatifs à : Remplacer une lettre wchar_t par une autre dans un fichier. (Unicode)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR