Pour ce cours vous aurez besoin des fonctions de conversion de binaire, décimal, hexadécimal écrite dans les cours précédents.

Vous pouvez télécharger le fichier ici pour travailler l'ensemble des exercices. Il contient les fonctions dont vous avez besoin.

Représentation du texte en machine

Transmettre un message !

Le codage des lettres afin de transmettre un message n'est pas récent. Citons par exemple :

Un ordinateur ne peux "communiquer" qu'à travers des signaux électrique : 0 ou 1. C'est à dire en binaire. Nous avons vu qu'il était possible de passer de binaire à décimal et de binaire à hexadécimal. L'idée est donc de coder toute sorte de caractère en décimal ou en hexadécimal. Pour faire écrire du texte à une machine, une solution est d'associer chaque caractère à un entier.

Il faut choisir dans un premier temps l'ensemble des caractères à coder.

Charset

Un charset, abréviation de l'anglais "character set", est la donnée de l'ensemble des caractères à coder.

<meta charset=" UTF-8 "> est une ligne de code que vous trouvez dans le "head " d'une page HTML est là pour indiquer la manière d'encoder les caractères présent dans le charset. Ici, cela signifie que l'encodage suivi est au format utf8.

Encodage

L'encodage d'un charset est la mise en relation des caractères que l'on veut coder et avec 1 ou plusieurs octets.

L'encodage ASCII

Au début des années 60, pour encoder un charset qui convient à la langue anglaise a été inventé le codage américain ASCII( American Standard Code for Information Interchange ) permettant de représenter sur 7 bits les caractères d'un clavier anglophone. Le "A " correspond au nombre 65, le "B " correspond au nombre 66,..., le "a " au nombre 97, le chiffre 0 au nombre 48, etc.

Vous pouvez vous rendre sur ce site qui propose d'encoder des caractères avec différents encodages. Ainsi la phrase est encodée en ASCII ainsi : .

En Python les fonctions qui permettent d'obtenir l'encodage d'un caractère compatible avec la table Unicode.(compatible ASCII) sont chr et ord

ord('k')
chr(65)
            

Tester ces fonctions avec d'autres arguments.

  1. Donner la représentation en binaire de "A ", "a ", "C " et "c " selon la table ASCII. On pourra utiliser les fonctions déjà réaliser dans le chapitre B1 et les fonctions chr et ord.
  2. Que remarque-t-on?

Vers la norme Unicode.

L'encodage ASCII était suffisant pour la langue anglaise (sans accent) mais pas pour toutes les autres. De nombreux systèmes d'encodage pour les autres langues ont donc été créés depuis, par exemple l'ISO 8859-1 ( ou latin-1) pour la langue française pour laquelle les accents sont importants. Ce système reprend les 128 codes ASCII(7 bits : de 0 à 127), et en ajoute 128 ( de 128 à 255). C'est donc un codage sur 8 bits.

Le problème est que les 128 codes ajoutés ne sont pas compatibles pour toutes les langues.

On a alors mis en place la norme unicode au début des années 90 qui offre une compatibilité avec toutes les langues.

Au départ prévu sur 2 octets (65536 caractères), il dispose maintenant de plus de 130 000 caractères

La norme Unicode

La norme Unicode définit entre autres un ensemble (ou répertoire) de caractères. Chaque caractère est repéré dans cet ensemble par un index entier aussi appelé « point de code ». Par exemple le caractère "€ " (euro) est le 8365ème caractère du répertoire Unicode, son index, ou point de code est donc 8364 (on commence à compter à partir de 0). Le répertoire Unicode peut contenir plus d'un millions de caractères, les points de code sont compris entre 0 et 0x10FFFF ce qui est bien trop grand pour tenir dans un seul octet (limité à des valeurs entre 0 et 255). La norme Unicode définit donc des méthodes standardisées pour coder et stocker cet index sous forme de séquence d'octets : UTF-8 ( codé sur 1 à 4 octets) est l'une d'entre elles, avec UTF-16, UTF32 et leurs différentes variantes.

Généralement en Unicode, un caractères prend entre 1 et 4 octets ( 1 octet=8 bits). Autrement dit, le moindre texte prend jusqu'à fois plus de place qu'en ASCII. Ce qui pose problème.

La grande majorité des caractères utilisés sont dans la table ASCII codés sur 7bits dans cette table. Il fallait donc trouver un format qui permettait de coder l'ensemble des caractères sans être beaucoup plus gourmand en mémoire que la table ASCII. C'est le format UTF-8.

Le 8 signifie que au minimum un caractère à besoin de 8 bits pour être codé ( en fait ceux de la table ASCII).

Un caractère en UTF-8 sera don encodé entre 1octet et 4 octets ( pour les caractères les plus rares).

On augmente le coup en mémoire de 1 bit pour les caractères de la table ASCII et on dispose d'un encodage universel.

Vous pouvez vous rendre sur cette page pour observer la table Unicode.
  1. Consulter la table Unicode

    Vous remarquez que chaque code est codé sous la forme de "U+1 valeur à 4 caractères en hexadecimal ce qui correspond au 1 à 4 octets.

  2. En utilisant les fonctions vu dans le chapitre hexadécimal et les fonctions chr et ord, vérifier que Python code est compatible avec la norme Unicode. Vous pourrez vérifier au moins trois valeurs de la tables
  3. A votre avis, pourquoi avoir donner une table en hexadécimal plutôt qu'en décimal?

Gestion des fichiers textes en Python

Ouverture et fermeture d'un fichier

La fonction open prend deux paramètres, le nom du fichier et le mode d'ouverture : 'w' pour le mode écriture (write), 'r' pour le mode lecture(read) et 'a' pour le mode ajout (append).

fichier=open('fichier','w')
fic=open('fichier','r')
fic=open('fichier','a')

Il faut systématiquement fermer le fichier:

fic.close()

Ecriture

La méthode write

La méthode write prend en paramètre une chaîne de caractère.

Pour forcer le saut de ligne on écrira \n

  1. Recopier le code suivant dans une cellule Jupyter :
    fic=open('fichier.txt','w')
    fic.write("la nsi,c'est vraiment top \nmême si les maths c'est vraiment génial aussi")
    fic.write("\n")
    fic.write("la nsi,c'est vraiment top"+"\n"+ "même si les maths c'est vraiment génial aussi")
    fic.close()
            
  2. Ouvrir le fichier créé avec un éditeur de texte. Qu'observe-t-on?
  1. L'extension ".txt" est là pour préciser avec quel logiciel lire le fichier.
  2. Pour écrire la valeur d'un entier, on utilisera la fonction str. Par exemple si a=1 "str(a)" affichera 1.

Ecrire une fonction table(n) qui créé un fichier donnant la table de multiplication du chiffre n.

On veut un affichage de ce type :

Lecture

Pour cette partie, récupérer le fichier txt compressé ici

La méthode read

Observer l'action de ces lignes de codes :

fic=open('dormeur.txt','r')
ch=fic.read()
ch2=fic.read(10)
            

Lecture ligne à ligne

Pour obtenir une liste contenant chaque ligne du texte on écrira ch=fic.readlines() ou ch=[x for x in fic]

Observer l'action de ces lignes de codes :

fic=open('dormeur.txt','r')
ch=fic.readlines()
fic2=open('dormeur.txt','r')
ch2=[x for x in fic2]
                

La méthode rstrip

la commande ch.rstrip() supprimer le caractère de fin de ligne.

Observer l'action de ces lignes de codes :

fic=open('dormeur.txt','r')
l=[]
ch=fic.readlines()
for ligne in ch:
    l.append(ligne.rstrip())
                

A partir du fichier dormeur du val. Ecrire une fonction dico_texte(nom)nom est une chaine de caractère correspond au nom d'un fichier txt et qui renvoie un dictionnaire avec comme clé les numéro de ligne du texte et comme valeur la ligne correspondante.

Tester avec le fichier dormeur.txt

La commande ch.split(sep) créé une liste en coupant la chaîne ch suivant le délimitateur sep

Testez ces codes pour comprendre le fonctionnement de la méthode split.

  1. ch="1;2;3;4;5;6;9;7"
    ch.split(';')
  2. ch="Quand on mettra les cons sur orbite, t'as pas fini de tourner."
    ch.split("o")
  1. Exécuter ce code dans votre fichier Jupyter.
    fic=open("fichier.dat","w")
    fic.write(str(5)+"\t"+str(8.3)+"\t"+str(1e-4)+"\n")
    fic.write(str(8)+"\t"+str(32.7)+"\t"+str(1e2))
    fic.close()
                            

    A quoi correspond le "\t". (vous pouvez ouvrir le fichier créer avec un éditeur de texte.

  2. Avec les méthodes rstrip et split, récupérer l'ensemble des valeurs contenues dans le fichier sous forme de liste.

L'encodage cp1252 et l'encodage utf-8

Commençons par créer deux fichiers pour travailler ces encodages :

fic=open('test1.txt','w')
fic.write("Bonjour\n")
fic.close()

fic=open('test2.txt','w')
fic.write('é\tè\tù\tê\tà\n')
fic.close()

                

Ouvrir le fichier test1.txt et test2.txt avec visual studio code. Qu'observez vous?

Quand vous êtes sur le fichier test2.txt. Cliquer sur utf-8 en bas de votre application visual studio code choisissez l'encodage windows 1252.

Par défaut l'encodage choisi par Python dès que votre chaine de caractère va contenir des accents elle sera codée avec la méthode write en cp1252. C'est l'encodage windows 1252 ou ANSI.

Pour régler ce problème, nous allons demander à Python d'encoder en utf-8. Puis d'utiliser la méthode write avec l'argument 'wb'.

ch='é\tè\tù\tê\tà\n'
ch=ch.encode('utf-8')
f=open('test3.txt','wb')
f.write(ch)
f.close()

Ouvrir le fichier test3.txt avec visual studio code.

L'argument "wb" dans la fonction open permet d'écrire en mode binaire, en effet l'encodage utf-8 est une suite d'octets( ou bytes)

Il faudra faire attention à cela quand vous ferez du web en codant en Python.

Observer à quoi ressemble l'encodage cp1252 et l'encodage utf-8 à l'aide d'un éditeur binaire comme :

ch='é\tè\tù\tê\tà\n'
ch.encode('cp1252')

ch='é\tè\tù\tê\tà\n'
ch.encode('utf-8')

QCM BNS

Voici une sélection de questions issues de la banque nationale de sujets, répondez à ces questions (attention, cette sélection n'est pas exhaustive). Le code HTML a été pris en grande partie sur le site de David Roche.

Le code ASCII permet de représenter en binaire les caractères alphanumériques. Quel est son principal inconvénient ?

  1. Il utilise beaucoup de bits.
  2. Il ne différencie pas les majuscules des minuscules.
  3. Il ne représente pas les caractères accentués.
  4. Il n'est pas compatible avec la plupart des systèmes informatiques.

Quel est un avantage du codage UTF8 par rapport au codage ASCII ?

  1. il permet de coder un caractère sur un octet au lieu de deux
  2. il permet de coder les majuscules
  3. il permet de coder tous les caractères
  4. il permet de coder différentes polices de caractères

On considère les codes ASCII en écriture hexadécimale (en base 16). Le code ASCII de la lettre A est 0x41, celui de la lettre B est 0x42, celui de la lettre C est 0x43, etc. Quel est le code ASCII, en hexadécimal, de la lettre X (c'est la 24e lettre de l'alphabet usuel).

  1. 0x58
  2. 0x64
  3. 0x7A
  4. 0x88

Laquelle de ces affirmations concernant le codage UTF-8 des caractères est vraie ?

  1. le codage UTF-8 est sur 7 bits
  2. le codage UTF-8 est sur 8 bits
  3. le codage UTF-8 est sur 1 à 4 octets
  4. le codage UTF-8 est sur 8 octets

Parmi les noms suivants, lequel n'est pas celui d'une méthode d'encodage des caractères ?

  1. UTF-16
  2. ASCII
  3. Arial
  4. Unicode

Parmi les caractères ci-dessous, lequel ne fait pas partie du code ASCII ?

  1. a
  2. B
  3. @
  4. é

Sur une page web qui s’affiche sur notre navigateur on peut lire : « En conséquence, l'Assemblée Nationale reconnaît et déclare, en présence [...] » Quelle peut être la cause des affichages étranges de cette page ?

  1. l'encodage des caractères n'est pas celui attendu par le navigateur
  2. le texte original est en japonais
  3. la taille des caractères n'est pas celui attendu par le navigateur
  4. la connexion à Internet présente des coupures

Olivier visite son site préféré pour relire le programme de NSI. Il devrait lire le texte ci-dessous :
L’enseignement de spécialité de numérique et sciences informatiques du cycle terminal de la voie générale vise l’appropriation des fondements de l’informatique pour préparer les élèves à une poursuite d’études dans l’enseignement supérieur, en les formant à la pratique d’une démarche scientifique et en développant leur appétence pour des activités de recherche.

Le paramétrage de son navigateur lui donne l’affichage ci-dessous :

L’enseignement de spécialité de numérique et sciences informatiques du cycle terminal de la voie générale vise l’appropriation des fondements de l’informatique pour préparer les élèves à une poursuite d’études dans l’enseignement supérieur, en les formant à la pratique d’une démarche scientifique et en développant leur appétence pour des activités de recherche.
Quel type d’encodage Olivier doit-il choisir dans les paramètres de son navigateur pour afficher correctement le texte ?

  1. ANSI
  2. LATIN-1
  3. UTF-8
  4. ASCII
Licence Creative Commons
NSI de Auteurs : Jean-Christophe Gérard, Thomas Lourdet, Johan Monteillet, Pascal Thérèse est mis à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International.