Transformation inverse du programme précédent :
prendre les numéros Unicode en décimal dans les entités HTML qui composent le fichier d'entrée,
et envoyer les codes UTF-8 dans le fichier de sortie.
Rédaction en C (fichier htmlToUTF8.c)
while ((val=fgetc(fentr)) !=EOF) {
if( val != '&' ){ /* ASCII */
fputc(val, fsort);
}else{
fscanf(fentr, "#%d;", &numuni);
if( numuni < 2048 ){ /* 11 bits, 2 octets */
val2 = 128 + (numuni & 63); /* les 6 derniers bits */
val1 = 192 + (numuni >> 6); /* les 5 bits de poids fort */
fputc(val1, fsort);
fputc(val2, fsort);
}else{
if( numuni < 65536 ){ /* 16 bits, 3 octets */
val3 = 128 + (numuni & 63); /* les 6 derniers bits */
val2 = 128 + ((numuni >> 6) & 63); /* les 6 suivants */
val1 = 224 + (numuni >> 12); /* les 4 bits de poids fort */
fputc(val1, fsort);
fputc(val2, fsort);
fputc(val3, fsort);
}else{ /* 4 octets */
val4 = 128 + (numuni & 63); /* les 6 derniers bits */
val3 = 128 + ((numuni >> 6) & 63); /* les 6 suivants */
val2 = 128 + ((numuni >> 12) & 63); /* les 6 suivants */
val1 = 240 + (numuni >> 18); /* les 3 bits de poids fort */
fputc(val1, fsort);
fputc(val2, fsort);
fputc(val3, fsort);
fputc(val4, fsort);
}
}
}
}/* while */
Vérification : la commande
./a.out don.html dan.txt
redonne bien un fichier dan.txt identique au don.txt d'origine.