Bonjour,
Merci de la remarque, Edgar. Voici le code avec ce qu'il faut, j'avais oublié une fonction :
<programme python>
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def repr_bin2(s, coding) :
return ''.join('{0:08b}'.format(c) for c in s.encode(coding))
def binaire_to_utf8 (s) :
return "".join([chr(int(s[i:i+8],2)) for i in range(0,len(s),8)])
s = 'é'
print(s.encode('utf-8'))
print(repr_bin2(s, 'utf8'))
binaire = repr_bin2(s, 'utf8')
print(binaire_to_utf8 (binaire))
</programme python>
renvoie
b'\xc3\xa9'
1100001110101001
é # là je m'attendais à é
Ceci dit, je me demande si ce n'est pas beaucoup plus général que ça. Je veux dire par là que cela semble impliquer le terminal aussi.
Avec
s = 'Je me suis vrillé les neurones avec UTF8 !'
le programme ci-dessus me donne:
b'Je me suis vrill\xc3\xa9 les neurones avec UTF8 !'
01001010011001010010000001101101011001010010000001110011011101010110100101110011001000000111011001110010011010010110110001101100110000111010100100100000011011000110010101110011001000000110111001100101011101010111001001101111011011100110010101110011001000000110000101110110011001010110001100100000010101010101010001000110001110000010000000100001
Je me suis vrillé les neurones avec UTF8 !
Avec la pièce jointe qui est encodé en UTF8 qui contient
Début
Numéro 180 : ´
Numéro 181 : µ
Numéro 182 : ¶
Numéro 183 : ·
Numéro 184 : ¸
Numéro 185 : ¹
Numéro 186 : º
Numéro 187 : »
Numéro 188 : ¼
Numéro 189 : ½
Numéro 190 : ¾
Fin
Dans un terminal, je fais
$file mon_test.txt
mon_test.txt: UTF-8 Unicode text
$ hd mon_test.txt
00000000 44 c3 a9 62 75 74 0a 4e 75 6d c3 a9 72 6f 20 31 |D..but.Num..ro 1|
00000010 38 30 20 3a 20 c2 b4 0a 4e 75 6d c3 a9 72 6f 20 |80 : ...Num..ro |
00000020 31 38 31 20 3a 20 c2 b5 0a 4e 75 6d c3 a9 72 6f |181 : ...Num..ro|
00000030 20 31 38 32 20 3a 20 c2 b6 0a 4e 75 6d c3 a9 72 | 182 : ...Num..r|
00000040 6f 20 31 38 33 20 3a 20 c2 b7 0a 4e 75 6d c3 a9 |o 183 : ...Num..|
00000050 72 6f 20 31 38 34 20 3a 20 c2 b8 0a 4e 75 6d c3 |ro 184 : ...Num.|
00000060 a9 72 6f 20 31 38 35 20 3a 20 c2 b9 0a 4e 75 6d |.ro 185 : ...Num|
00000070 c3 a9 72 6f 20 31 38 36 20 3a 20 c2 ba 0a 4e 75 |..ro 186 : ...Nu|
00000080 6d c3 a9 72 6f 20 31 38 37 20 3a 20 c2 bb 0a 4e |m..ro 187 : ...N|
00000090 75 6d c3 a9 72 6f 20 31 38 38 20 3a 20 c2 bc 0a |um..ro 188 : ...|
000000a0 4e 75 6d c3 a9 72 6f 20 31 38 39 20 3a 20 c2 bd |Num..ro 189 : ..|
000000b0 0a 4e 75 6d c3 a9 72 6f 20 31 39 30 20 3a 20 c2 |.Num..ro 190 : .|
000000c0 be 0a 46 69 6e |..Fin|
000000c5
D'un côté, 'é' est bien codé sur 2 octets avec pour code hexa "c3 a9", d'un autre, au lieu de reconnaître Début, hd renvoie D..but.
Voilou !
GL
PS : tu m'as mis le doute quand j'ai vu : édéon Légaut a écrit ;-)
----- Mail original -----
De: "Edgar Bonet" <guilde@???>
À: guilde@???
Envoyé: Jeudi 27 Février 2020 10:29:08
Objet: Re: encoding encoding ...
Bonjour !
Gédéon Légaut a écrit ;-) :
> <programme python>[...]</programme python>
J'obtiens :
NameError: name 'binaire_to_utf8' is not defined
Je crois que tu n'en a pas mis assez pour qu'on puisse tester de notre
côté.
> En cherchant du côté de locale [...] Est-ce que cela peut venir
> d'Emacs ? [...]
Si tu as des doutes sur l'encodage d'un fichier ou de la sortie d'un
programme, je te suggère d'utiliser la commande hd (ou hexdump). Ça
montre le contenu octet par octet, et ça lève donc toute ambigüité :
$ echo "s = 'é'" | hd
00000000 73 20 3d 20 27 c3 a9 27 0a |s = '..'.|
00000009
À+,
Edgar.
Début
Numéro 180 : ´
Numéro 181 : µ
Numéro 182 : ¶
Numéro 183 : ·
Numéro 184 : ¸
Numéro 185 : ¹
Numéro 186 : º
Numéro 187 : »
Numéro 188 : ¼
Numéro 189 : ½
Numéro 190 : ¾
Fin