4.2. Extension à davantage de caractères#
La table se complique lorsqu’on veut insérer d’autres caractères.
char = "é"
str.encode(char, "iso8859-1")
b'\xe9'
chr(0xe9)
'é'
str.encode(char, 'utf-8')
b'\xc3\xa9'
bytes.decode(b'\xe9', 'utf-8')
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (most recent call last)
Cell In[5], line 1
----> 1 bytes.decode(b'\xe9', 'utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 0: unexpected end of data
Attention| si on cherche à décoder un caractère avec un autre jeu que celui qui le représente, on obtient une erreur.
bytes.decode(b'\xc3\xa9', 'iso8859-15')
'é'
La table ASCII ne contenant pas tous les caractères de toutes les langues, celle-ci a été étendue, localement en fonction des besoins d’une langue ou d’une autre. Ainsi, on a eu
iso-8859-1 pour le latin étendu (caractères accentués)
iso-8859-8 pour le turc par exemple
mac pour les ordinateurs Mac des années 1980/1990
Depuis 1990, le consortium Unicode (qui réunit des industriels et des universitaires) a cherché à unifier les tables de caractères en proposant un système permettant de représenter des millions de graphèmes (unité d’affichage).
Ce sytème est organisé en plans, chacun étant une table de 0x0000 à 0xffff
0xffff
65535
Le plan 0 contient à lui tout seul 65535 caractères. Le premier chiffre à gauche code le plan, et les 4 chiffres suivants codent la position du caractère dans le plan.
chr(0x00153)
'œ'
ord('œ')
339
chr(0x1f353)
'🍓'
Même si un caractère existe dans Unicode, il peut ne pas être représenté si votre système d’exploitation de possède pas de glyphe dans la fonte (police) utilisée.
La fonction python qui permet, pour un caractère donné, d’afficher son point de code Unicode est ord().
ord('🍓')
127827
hex(ord('🍓'))
'0x1f353'
Cette fonction| comme la fonction chr() fonctionne caractère par caractère. Si on veut travailler sur une chaine d’octets (bytes), il faut utiliser les fonctions str.encode et bytes.decode.
str.encode("Une fraise : 🍓")
b'Une fraise : \xf0\x9f\x8d\x93'