/*
Fichier utf8-iso8859.c
Auteur Bernard Chardonneau
Logiciel libre, droits d'utilisation précisés en français
dans le fichier : licence-fr.txt
Traductions des droits d'utilisation dans les fichiers :
licence-de.txt , licence-en.txt , licence-es.txt ,
licence-it.txt , licence-nl.txt , licence-pt.txt ,
licence-eo.txt , licence-eo-utf.txt
Droits d'utilisation également sur la page web :
http://libremail.tuxfamily.org/voir.php?page=droits
Remplacement des caractères UTF8 par leur équivalent ASCII
(pour les caractères correspondant à un code entre A0h et FFh)
*/
#include <stdio.h>
/* programme principal */
int main (int narg, char *varg[])
{
int car; // caractère du fichier à convertir
// tableau de conversion des caractères de la série E2809x
char E2809x [16] = {'-', '-', '-', '-', '-', '-', '|', '_',
'\'', '\'', ',', '`', '"', '"', '"', '"'};
// utiliser fichiers passés en paramètre à la place du clavier et de l'écran
if (narg > 1)
freopen (varg [1], "r", stdin);
if (narg > 2)
freopen (varg [2], "w", stdout);
// lire un caractère
car = getchar ();
// tantque non fin de fichier
while (car != EOF)
{
// si caractère Ã
if (car == 0xC3)
{
// lire le caractère suivant
car = getchar ();
// s'il est compris entre 80h et BFh
if (car >= 0x80 && car < 0xC0)
// le convertir dans l'encodage iso8859-1
putchar (car | 0x40);
// sinon
else
{
// envoyer les 2 derniers caractères lus tels quels
putchar (0xC3);
putchar (car);
}
}
// si caractère Â
else if (car == 0xC2)
{
// lire le caractère suivant
car = getchar ();
// s'il n'est pas compris entre 80h et BFh
if (car < 0x80 || car >= 0xC0)
// on renvoie la séquence de 2 caractères
putchar (0xC2);
// sinon on ne renvoie que le 2ème caractère de la séquence
putchar (car);
}
// le caractère Å suivi du caractère 93h sera remplacé par ½
else if (car == 0xC5)
{
car = getchar ();
if (car == 0x93)
putchar ('½');
else
{
putchar (0xC5);
putchar (car);
}
}
// si caractère â , suivi de 80h, suivi d'un caractère >= 80h
// on convertira ce 3ème caractère
else if (car == 0xE2)
{
car = getchar ();
if (car == 0x80)
{
car = getchar ();
if (car <= 0x8F)
; // caractère ignoré
else if (0x90 <= car && car <= 0x9F)
putchar (E2809x [car & 0x0F]);
else if (car == 0xA6)
{
putchar ('.');
putchar ('.');
putchar ('.');
}
else
{
putchar (0xE2);
putchar (0x80);
putchar (car);
}
}
else
{
putchar (0xE2);
putchar (car);
}
}
// sinon, cas général
else
// on renvoie le caractère courant
putchar (car);
// lire le caractère suivant
car = getchar ();
}
// pour faire plaisir à gcc qui veut une fonction main de type int
return (0);
}