La fonction bytes() peut recevoir un tableau d'entiers compris entre 0 et 255 et renvoie alors un nouveau bytes correspondant à ces valeurs.
>>> memoire = bytes([12, 65, 200, 155, 72])
Mais elle peut aussi recevoir un str sous condition d'indiquer avec quel système d'encodage on veut encoder nos caractères.
>>> memoire = bytes("Bonjour à tous")
TypeError: string argument without an encoding
>>> memoire = bytes("Bonjour à tous", encoding="ascii")
UnicodeEncodeError: 'ascii' codec can't encode character '\xe0' in position 8: ordinal not in range(128)
>>> memoire = bytes("Bonjour à tous", encoding="latin-1")
>>> list(memoire)
[66, 111, 110, 106, 111, 117, 114, 32, 224, 32, 116, 111, 117, 115]
>>> memoire = bytes("Bonjour à tous", encoding="utf-8")
>>> list(memoire)
[66, 111, 110, 106, 111, 117, 114, 32, 195, 160, 32, 116, 111, 117, 115]
>>> memoire = bytes("Bonjour à tous", encoding="utf-16")
>>> list(memoire)
[255, 254, 66, 0, 111, 0, 110, 0, 106, 0, 111, 0, 117, 0, 114, 0, 32, 0, 224, 0, 32, 0, 116, 0, 111, 0, 117, 0, 115, 0]
>>> memoire = bytes("Bonjour à tous", encoding="utf-32")
>>> list(memoire)
[255, 254, 0, 0, 66, 0, 0, 0, 111, 0, 0, 0, 110, 0, 0, 0, 106, 0, 0, 0, 111, 0, 0, 0, 117, 0, 0, 0, 114, 0, 0, 0, 32, 0, 0, 0, 224, 0, 0, 0, 32, 0, 0, 0, 116, 0, 0, 0, 111, 0, 0, 0, 117, 0, 0, 0, 115, 0, 0, 0]
Comme on peut le constater, l'encodage UTF-8 est celui qui permet de limiter le nombre d'octets nécessaires tout en permettant d'enregistrer n'importe quel caractère défini dans la table universelle UNICODE.