Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Converion UTF8 ISO-8859-1

4 réponses
Avatar
Denis
Bonjour,

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.

4 réponses

Avatar
Alexandre Bacquart
Denis wrote:
Bonjour,

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.



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
Avatar
espie
In article <4b1d07b6$0$23336$,
Alexandre Bacquart wrote:
Denis wrote:
Bonjour,

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.



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



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. ;-)
Avatar
Mickaël Wolff
Denis a écrit :

On m'a parlé de recode ou iconv mais je ne parviens pas à trouver les outils
qui me permette de les utiliser.




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
Avatar
Antoine Leca
Denis écrivit :
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.



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 ("xC2x80") à U+009F/0x9F
("xC2x9F") 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