while ((val=fgetc(fp)) !=EOF) {
if( val < 128 ){ /* ASCII */
printf("%d\n", val);
}else{
val1 = val;
if( val1 >= 240 ){ /* 4 octets : 240 = 128+64+32+16 */
val2 = fgetc(fp);
val3 = fgetc(fp);
val4 = fgetc(fp);
printf("%d %d %d %d\n", val1, val2, val3, val4);
}else{
if( val1 >= 224 ){ /* 3 octets : 224 = 128+64+32 */
val2 = fgetc(fp);
val3 = fgetc(fp);
printf("%d %d %d\n", val1, val2, val3);
}else{ /* 2 octets : >192 = 128+64 */
val2 = fgetc(fp);
printf("%d %d\n", val1, val2);
}
}
}
} /* while */
jfp% ./a.out don.txt
65
97
32
194 161
32
195 169
195 160
197 147
195 185
195 167
195 135
32
225 130 171
225 130 171
32
195 191
32
240 144 140 176
32
240 144 140 178
32
225 131 147
32
122
90
jfp%
Pour pouvoir vérifier commodément que nos programmes sont corrects, nous écrirons le numéros Unicode calculés dans un fichier
sous forme d'entités HTML, c'est-à-dire dans le format "&#lenuméro-en-décimal;".
Ce format est directement interprétable par un navigateur Web, il
suffira donc de faire lire le fichier-résultat à un navigateur
quelconque pour constater de visu que la traduction est exacte.
while ((val=fgetc(fentr)) !=EOF) {
if( val < 128 ){ /* ASCII */
fprintf(fsort, "%c", val);
}else{
if( val >= 240 ){ /* 4 octets : 240 = 128+64+32+16 */
contr1 = (val - 240) * 262144;
contr2 = (fgetc(fentr)-128) * 4096;
contr3 = (fgetc(fentr)-128) * 64;
contr4 = fgetc(fentr)-128;
fprintf(fsort, "&#%d;", contr1+contr2+contr3+contr4);
}else{
if( val >= 224 ){ /* 3 octets : 224 = 128+64+32 */
contr1 = (val - 224) * 4096;
contr2 = (fgetc(fentr)-128) * 64;
contr3 = (fgetc(fentr)-128);
fprintf(fsort, "&#%d;", contr1 + contr2 + contr3);
}else{ /* 2 octets : >192 = 128+64 */
contr1 = (val - 192) * 64;
contr2 = fgetc(fentr)-128;
fprintf(fsort, "&#%d;", contr1+contr2);
}
}
}
}/* while */
jfp% ./a.out don.txt don.html
jfp% cat don.html
Aa ¡ éàœùçÇ ႫႫ ÿ 𐌰 𐌲 დ zZ
jfp%
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 */
while ((val=fgetc(fentr)) !=EOF) {
if( val != '\\' ){ /* ASCII */
fputc(val, fsort);
}else{
fscanf(fentr, "u%x;", &numuni);
.... le reste sans modification ....
}
}/* while */