Re: encoding encoding ...

Page principale

Répondre à ce message
Auteur: gedeon.legaut
Date:  
À: guilde
Sujet: Re: encoding encoding ...
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