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.
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.
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.
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.
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 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.
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()
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
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()
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 :
Pour cette partie, récupérer le fichier txt compressé ici
La méthode read
ch=fic.read()
lit tout le fichierch=fic.read(n)
lit les n premiers caractères de ficObserver 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)
où 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.
ch="1;2;3;4;5;6;9;7"
ch.split(';')
ch="Quand on mettra les cons sur orbite, t'as pas fini de tourner."
ch.split("o")
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.
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')
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 ?
Quel est un avantage du codage UTF8 par rapport au codage ASCII ?
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).
Laquelle de ces affirmations concernant le codage UTF-8 des caractères est vraie ?
Parmi les noms suivants, lequel n'est pas celui d'une méthode d'encodage des caractères ?
Parmi les caractères ci-dessous, lequel ne fait pas partie du code ASCII ?
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 ?
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 ?