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