Partage
  • Partager sur Facebook
  • Partager sur Twitter

erreur l'ors de la conversion texte vers binaire

caractères non reconnus

28 février 2021 à 22:04:23

Bonjour,

Pour un travail je dois prendre le contenue d'un fichier et le convertir en binaire, voila mon code :

txt = open('file.txt', encoding='utf-8')
    clearRead = txt.read()
    print(clearRead)
    txt.close()
    clearRead = clearRead.replace(' ', '')
    binary = ''.join(format(ord(i), '08b') for i in clearRead)
    print(binary)

mon problème est que quand le fichier contient des accents ou d'autres caractères spéciaux ils ne sont pas bien convertis en binaires (ca donne des caractères comme ca une foi le binaire décodé : Ã©Õ )

Le contenue du fichier est lu sans problèmes, c'est bien au niveau de la conversion texte vers binaire qu'il y a un problèmes.

Merci beaucoup pour votre aide,

bonne soirée.

  • Partager sur Facebook
  • Partager sur Twitter
1 mars 2021 à 5:01:15

Dans l'exemple que tu donnes, c'est le premier print qui affiche des caractères bizarre, pas le deuxième ?

Tu peux donner un exemple de chaîne qui fait ça qu'on puisse tester, parce qu'on ne sait pas ce qu'il y a dans ton fichier.

J'ai testé ta ligne de conversion en binaire chez moi, et même avec des caractères spéciaux et accentués ça n'affiche rien de bizarre, juste des 1 et des 0 comme prévu..

-
Edité par LoupSolitaire 1 mars 2021 à 5:02:30

  • Partager sur Facebook
  • Partager sur Twitter

Blond, bouclé, toujours le sourire aux lèvres...

1 mars 2021 à 6:56:15

Il faudrait peut-être donner tout le contexte:
+ système d'exploitation.
+ comment a été créé le fichier
+ comment est exécuté le script, par exemple avec cmd sous Windows
Je suis sur Windows 10 et j'utilise cmd.
Je n'ai pas réussi à reproduire le problème.
J'ai tenté de faire quelques  chcp  pour changer le code, mais ça continue à fonctionner.
Par contre, j'avais mis un fichier html avec conversion windows-1252 et j'avais ce genre de caractères bizarres.
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

1 mars 2021 à 8:43:27

LoupSolitaire a écrit:

Dans l'exemple que tu donnes, c'est le premier print qui affiche des caractères bizarre, pas le deuxième ?

Tu peux donner un exemple de chaîne qui fait ça qu'on puisse tester, parce qu'on ne sait pas ce qu'il y a dans ton fichier.

J'ai testé ta ligne de conversion en binaire chez moi, et même avec des caractères spéciaux et accentués ça n'affiche rien de bizarre, juste des 1 et des 0 comme prévu..

-
Edité par LoupSolitaire il y a environ 3 heures


Bonjour et merci pour la reponse

le fichier contient :

"►  un énoncé non justifié par un raisonnement rigoureux"

quand je converti en binaire il en sort des 0 et des 1 (pas de problèmes) mais quand je convertie le binaire obtenu en texte j'obtient du chinois :/

Merci

  • Partager sur Facebook
  • Partager sur Twitter
1 mars 2021 à 10:53:27

Le texte étant en UTF8 les caractères spéciaux pèses plusieurs octets. Tu ne nous montre pas comment tu décodes les représentations binaires.

>>> # Encoding :
>>> text = "►  un énoncé non justifié par un raisonnement rigoureux"
>>> data = text.encode()
>>> data
b'\xe2\x96\xba  un \xc3\xa9nonc\xc3\xa9 non justifi\xc3\xa9 par un raisonnement rigoureux'
>>> numbers = list(data)
>>> numbers
[226, 150, 186, 32, 32, 117, 110, 32, 195, 169, 110, 111, 110, 99, 195, 169, 32, 110, 111, 110, 32, 106, 117, 115, 116, 105, 102, 105, 195, 169, 32, 112, 97, 114, 32, 117, 110, 32, 114, 97, 105, 115, 111, 110, 110, 101, 109, 101, 110, 116, 32, 114, 105, 103, 111, 117, 114, 101, 117, 120]
>>> binaries = [format(n, "08b") for n in numbers]
>>> binaries
['11100010', '10010110', '10111010', '00100000', '00100000', '01110101', '01101110', '00100000', '11000011', '10101001', '01101110', '01101111', '01101110', '01100011', '11000011', '10101001', '00100000', '01101110', '01101111', '01101110', '00100000', '01101010', '01110101', '01110011', '01110100', '01101001', '01100110', '01101001', '11000011', '10101001', '00100000', '01110000', '01100001', '01110010', '00100000', '01110101', '01101110', '00100000', '01110010', '01100001', '01101001', '01110011', '01101111', '01101110', '01101110', '01100101', '01101101', '01100101', '01101110', '01110100', '00100000', '01110010', '01101001', '01100111', '01101111', '01110101', '01110010', '01100101', '01110101', '01111000']
>>> 
>>> # Decoding :
>>> numbers = [int(s, 2) for s in binaries]
>>> numbers
[226, 150, 186, 32, 32, 117, 110, 32, 195, 169, 110, 111, 110, 99, 195, 169, 32, 110, 111, 110, 32, 106, 117, 115, 116, 105, 102, 105, 195, 169, 32, 112, 97, 114, 32, 117, 110, 32, 114, 97, 105, 115, 111, 110, 110, 101, 109, 101, 110, 116, 32, 114, 105, 103, 111, 117, 114, 101, 117, 120]
>>> data = bytes(numbers)
>>> data
b'\xe2\x96\xba  un \xc3\xa9nonc\xc3\xa9 non justifi\xc3\xa9 par un raisonnement rigoureux'
>>> text = data.decode()
>>> text
'►  un énoncé non justifié par un raisonnement rigoureux'
  • Partager sur Facebook
  • Partager sur Twitter
1 mars 2021 à 11:37:27

starterPck a écrit:

quand je converti en binaire il en sort des 0 et des 1 (pas de problèmes) mais quand je convertie le binaire obtenu en texte j'obtient du chinois :/


Le texte est en Unicode.

La fonction ord va retourner des entiers dans l'intervalle 0..0x10FFFF.

On peut toujours en faire une suite de bits mais format(n, '08b') s'assure juste que si le nombre de bits nécessaires est inférieur à 8, ils seront complétés par des 0 en entête.... et pour les codes > 256, vous aurez une longueur variable qui fera foirer le découpage en tranches de 8.

Une solution pour vous en sortir pourrait être d'encoder l'Unicode en latin-1 (ou même en utf-8) vous auriez alors une suite de bytes que vous pouvez transformer en suite de chiffres 0 et 1. L'opération inverse sera de découper en tranches de 8 bits, refabriquer le byte (l'entier) puis le décoder (latin-1 ou utf-8) pour récupérer les caractères (affichés) de départ.

  • Partager sur Facebook
  • Partager sur Twitter
1 mars 2021 à 16:51:20

.H.D.1. a écrit:

Le texte étant en UTF8 les caractères spéciaux pèses plusieurs octets. Tu ne nous montre pas comment tu décodes les représentations binaires.

>>> # Encoding :
>>> text = "►  un énoncé non justifié par un raisonnement rigoureux"
>>> data = text.encode()
>>> data
b'\xe2\x96\xba  un \xc3\xa9nonc\xc3\xa9 non justifi\xc3\xa9 par un raisonnement rigoureux'
>>> numbers = list(data)
>>> numbers
[226, 150, 186, 32, 32, 117, 110, 32, 195, 169, 110, 111, 110, 99, 195, 169, 32, 110, 111, 110, 32, 106, 117, 115, 116, 105, 102, 105, 195, 169, 32, 112, 97, 114, 32, 117, 110, 32, 114, 97, 105, 115, 111, 110, 110, 101, 109, 101, 110, 116, 32, 114, 105, 103, 111, 117, 114, 101, 117, 120]
>>> binaries = [format(n, "08b") for n in numbers]
>>> binaries
['11100010', '10010110', '10111010', '00100000', '00100000', '01110101', '01101110', '00100000', '11000011', '10101001', '01101110', '01101111', '01101110', '01100011', '11000011', '10101001', '00100000', '01101110', '01101111', '01101110', '00100000', '01101010', '01110101', '01110011', '01110100', '01101001', '01100110', '01101001', '11000011', '10101001', '00100000', '01110000', '01100001', '01110010', '00100000', '01110101', '01101110', '00100000', '01110010', '01100001', '01101001', '01110011', '01101111', '01101110', '01101110', '01100101', '01101101', '01100101', '01101110', '01110100', '00100000', '01110010', '01101001', '01100111', '01101111', '01110101', '01110010', '01100101', '01110101', '01111000']
>>> 
>>> # Decoding :
>>> numbers = [int(s, 2) for s in binaries]
>>> numbers
[226, 150, 186, 32, 32, 117, 110, 32, 195, 169, 110, 111, 110, 99, 195, 169, 32, 110, 111, 110, 32, 106, 117, 115, 116, 105, 102, 105, 195, 169, 32, 112, 97, 114, 32, 117, 110, 32, 114, 97, 105, 115, 111, 110, 110, 101, 109, 101, 110, 116, 32, 114, 105, 103, 111, 117, 114, 101, 117, 120]
>>> data = bytes(numbers)
>>> data
b'\xe2\x96\xba  un \xc3\xa9nonc\xc3\xa9 non justifi\xc3\xa9 par un raisonnement rigoureux'
>>> text = data.decode()
>>> text
'►  un énoncé non justifié par un raisonnement rigoureux'


Merci beaucoup pour ta réponse,

je décode le binaire comme ca :

bin_list = "01100100 01110101 ..."
bin_to_text = "".join([chr(int(binary, 2)) for binary in bin_list.split(" ")])

Merci

  • Partager sur Facebook
  • Partager sur Twitter
1 mars 2021 à 16:57:31

une question, pourquoi dans ton code d'origine tu supprimais les espaces ? les espaces sont des caractères comme les autres, qui a son propre code ASCII/binaire
  • Partager sur Facebook
  • Partager sur Twitter