Je dois traiter des fichiers encod�s en UTF 8 avec des outils qui ne savent
pas traiter cet encodage. J'ai donc besoin d'une conversion pr�liminaire.
Je pr�cise qu eje suis sous Windows et que je cherche quelque chose qui me
permette, grossi�rement de prendre le fichier UTF-8 en entr�e et me restitue
le fichier ISO 8859 en sortie.
On m'a parl� de recode ou iconv mais je ne parviens pas � trouver les outils
qui me permette de les utiliser.
Merci pour votre aide,
Denis.
Rien � voir avec le C. Sinon, il y a un outil mortel sous Windows pour
le faire, �a s'appelle Notepad je crois ("Save As" -> encoding ANSI).
--
Alex
Mais si, mais si, ca peut avoir a voir avec le C.
Par exemple, avec setlocale(3) ou fgetws(3).
Bon, bien sur, c'est pas totalement sur que ca va faire quelque chose de tres
raisonnable si on jongle avec setlocale(3) pour changer d'etat alors qu'on est
en train de lire d'un fichier et ecrire sur un autre... mais bon, c'est le
lot commun du C, avec tout son etat global qui est souvent un tantinet chiant
a gerer.
Si le posteur ne dedaigne pas a regarder du cote du C++, les facets devraient
lui donner une solution bien plus acceptable. ;-)
iconv + API m'a dpnn� en premier r�sultat le lien suivant
<http://publib.boulder.ibm.com/iseries/v5r1/ic2924/index.htm?info/apis/iconv.htm>
--
Micka�l Wolff aka Lupus Michaelis
http://lupusmic.org
La conversion ᅵ idiote ᅵ UTF-8 vers ISO/CEI 8859-1 est trᅵs simple, il
n'y a que trois cas actifs distincts (code ᅵcrit d'une traite, non testᅵ) :
unsigned char c=*p++;
if( c<=0x7F ) donne(c);
else if( /*c>=0x80 &&*/ c<=0xC1 ) ERREUR_ENCODAGE();
else if( c==0xC2 ) donne(*p++);
else if( c==0xC3 ) donne(0x40+*p++);
else if( /*c>=0xC4 &&*/ c<=0xDF ) p+=1, donne(SUB);
else if( /*c>=0xE0 &&*/ c<=0xEF ) p+=2, donne(SUB);
else if( /*c>=0xF0 &&*/ c<=0xF7 ) p+=3, donne(SUB);
else if( /*c>=0xF8 &&*/ c<=0xFB ) p+=4, donne(SUB);
else if( /*c>=0xFC &&*/ c<=0xFD ) p+=5, donne(SUB);
else/*if( c>=0xFE && c<=0xFF)*/ ERREUR_ENCODAGE();
SUB est le caractᅵre de bourrage pour remplacer des caractᅵres inconnus.
ᅵvidemment, tu peux^W dois ᅵtre plus strict dans ta conversion, et gᅵrer
correctement les lectures en avant (le p+=X au-dessus peut aller au-delᅵ
de la fin du tampon, ce n'est pas contrᅵlᅵ, c'est MAL) ; voire ᅵtre plus
restrictif sur les donnᅵes en entrᅵe, par exemple vᅵrifier que les
donnᅵes aprᅵs le premier "c" sont bien dans la gamme 0x80..0xBF. Et
officiellement les caractᅵres de U+0080/0x80 ("\xC2\x80") ᅵ U+009F/0x9F
("\xC2\x9F") ne sont pas des caractᅵres autorisᅵs, ceci n'est pas non
plus filtrᅵ.
Il faut bien voir que ce code ne traite QUE les caractᅵres du jeu
iso-8859-1, au sens strict; ainsi ᅵ, ᅵ ou ᅵ ne seront pas convertis du
tout, mᅵme pas remplacᅵs par Y dans le dernier cas, ou par le symbole
ᅵquivalent en forme de soleil pour le symbole ᅵ. Idem pour les
caractᅵres Windows comme les apostrophes courbes...
> Je prᅵcise qu eje suis sous Windows et que je cherche quelque chose qui me
> permette, grossiᅵrement de prendre le fichier UTF-8 en entrᅵe et me restitue
> le fichier ISO 8859 en sortie.
>
> On m'a parlᅵ de recode ou iconv mais je ne parviens pas ᅵ trouver les outils
> qui me permette de les utiliser.
iconv remplace recode, donc tu peux oublier ce premier.
iconv reprᅵsente deux choses, d'une part une _fonction_ de conversion (ᅵ
utiliser en C, donc), d'autre part un utilitaire qui convertit des
fichiers ᅵ la volᅵe. Si c'est le second qui t'intᅵresse, comme ton
message peux le laisser ᅵ penser, tu t'es largement trompᅵ de groupe !
Si c'est bien le premier, comme dit Mickaᅵl une recherche Google te
donne une myriade de solutions ; pour ma part, j'utilise avec grand
succᅵs "win32" comme ᅵlᅵment de recherche pour trouver les portages
Windows des bibliothᅵques qui m'intᅵressent ; et ᅵvidemment le premier
rᅵsultat Google est exactement ce qu'il faut. Mais bon, ce n'est pas non
plus un groupe dᅵdiᅵ ᅵ l'utilisation de Google...
Antoine