TP5 : Mails, Chaînes de caractères
4. Codage des caractères dans le terminal
4.1
Format widechar
: tous les caractères sur 32 bits.
Mais : inconvénient : trop lourd.
UTF-8 : caractères de tailles variables.
- ex :
11xxxx
: on est au milieu d’un caractères
MAIS :
- le caractère ⋯ en UTF-8 (3 points) : sur 3 octets
- les 3 caractères
Comment reconnaître un texte encodé en UTF-8 lu en ISO 8859 ? (page d’exemple ):
- le “a tilde” Ã : est le premier octet d’un “é” (en UTF-8)
- s’il est suivi par un “copyright” © : c’est le deuxième octet du “é” en UTF-8
En fait, en machine, le caractère est : C3A9
= 1010 1001 11000011
- en ISO-8859 1 :
1010 1001
luÃ
11000011
lu©
- en UTF-8 :
1010 1001 11000011
lué
Bien faire la distinction entre :
- Entrée de la donnée : le caractère qu’on saisit
- Stockage : le stockage de la donnée
- Affichage de la donnée : le rendu visuel
mon_fichier.txt :
Ville;Code
Caen;14000
L'Haÿ-les-Roses;94240
Schlœcher; 967233
En Bash :
while read line
do
town="$(echo $line | cut -d ';' | -f 1)"
code="$(echo $line | cut -d ';' | -f 2)"
done < mon_fichier.txt
Pour connaître l’encodage d’un fichier :
file mon_fichier
Pour le convertir de ISO 08859-1 vers UTF-8, par ex :
iconv -f ISO088591 -t UTF8 fichier
NB : Attention, à chaque fois qu’on compile un programme, toujours faire :
gcc -o fichier_sortie -Wall fichier_entree
#include <stdio.h>
int main(){
int i;
char *villes[] = {"Saint-Étienne", "Paris"};
char *postal[] = {"42000", "75000"};
for (i=0; i<3; i++){
printf("%-22s %s \n", villes[i], postal[i]);
}
return 0;
}
Attention : printf
affiche octet par octet, ce qui provoque des décalages dans le cas où les caractères n’ont pas une taille fixée (ex: en UTF-8).
Pour régler ce problème : forcer les widechar
, pour que tous les caractères soient sur 32 bits :
#include <stdio.h>
int main(){
int i;
char *villes[] = {"Saint-Étienne", "Paris"};
char *postal[] = {"42000", "75000"};
setlocale(LC_CTYPE, "fr_FR.UTF-8");
for (i=0; i<3; i++){
wprintf(L"%-22s %s \n", villes[i], postal[i]);
}
return 0;
}
NB: Pour connaître la syntaxe :
man setlocale
Les fonctions en C sont en général documentées dans le manuel.
Leave a comment