Partage
  • Partager sur Facebook
  • Partager sur Twitter

socket et l'encodage

Sujet résolu
Anonyme
    13 août 2011 à 10:27:56

    Bonjour, je programme un serveur de controle à distance en python (qui execute des commande dos et envoi le résultat au client)

    Il y a un problème au niveau de l'envoi des donnees tout est décalé (voir image) :
    http://img11.hostingpics.net/pics/244283serv.png

    Au début je me suis dit que cela venais du client telnet de windows mais avec putty c'est pareil par contre dans la console de python tous est OK

    PS : un personne m'as déja aidé ici
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
    Anonyme
      13 août 2011 à 10:43:56

      Oui désolé :p je l'oubli tous le temps celui-la

      while (conn.connect):           
              data = conn.recv(2048)
              if not data: break
              
              if data != "\r\n":
                  cmd = cmd + data
      
              else:
                  print " >> " + cmd
                  execute = os.popen(cmd).read()
                  print execute
                  conn.send(execute)           
                  conn.send(" >> ")
                  cmd = ""
      


      J'ai essayé de mettre un .decode("utf8") à :
      execute = os.popen(cmd).read()

      Puis un .encode("utf8") à :
      conn.send(execute)

      Mais la sa me met une erreur :
      conn.send(execute.encode("utf-8"))
      UnicodeDecodeError: 'ascii' codec can't decode byte 0x82 in position 52: ordinal not in range(128)
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        13 août 2011 à 11:11:10

        On ne peut pas recevoir si on a pas émis, donc la méthode send se trouve avant la méthode recv

        while True:
            data = raw_input( '>>' )
            if not data:
                break
            conn.send(data)
            data = conn.recv(2048)
            if not data:
                break
            print data
        


        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          13 août 2011 à 11:18:55

          heu...
          Le serveur reçois très bien c'est juste qu'il y a un problème pendant l'envoi des données au niveau de l'encodage
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            13 août 2011 à 11:34:35

            En ce qui concerne ton problème, on doit transformer le data en unicode, car tu renvoies sûrement des accents ou des caractères spéciaux qui ne sont pas dans la table de caractères ASCII

            data = data.decode('utf8') # transforme la chaîne en unicode
            data = data.encode('utf8') # renvoie la chaîne correctement liée à la table
            


            Aussi à vérifier que tu as bien mis en haut de ton fichier # -*- coding:utf8 -*-
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              13 août 2011 à 11:42:03

              Le problème c'est que le decode("utf8") me renvoi :

              UnicodeDecodeError: 'utf8' codec can't decode byte 0x82 in position 52: unexpected code byte

              Par contre avec un decode("850") et un encode("cp1252") écrit dans un fichier texte c'est niquel ! Sof dans le client telent c'est toujours décalé TT :

              print " >> " + cmd
              execute = os.popen(cmd).read().decode("850")
              execute = execute.encode("cp1252")
              f = open("journal.txt","a")
              f.write(execute)
              f.close()
              conn.send(execute)
              conn.send(" >> ")
              cmd = ""
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                13 août 2011 à 11:42:51

                Citation

                Aussi à vérifier que tu as bien mis en haut de ton fichier # -*- coding:utf8 -*-

                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  13 août 2011 à 11:50:38

                  Avec ou sans j'ai la même erreur
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    13 août 2011 à 11:58:58

                    Chez moi je teste en ouvrant un fichier texte avec accents, il y a pas de soucis ça fonctionne nickel sans même utiliser decode encode etc...

                    Sous windows, essai d'ouvrir un fichier txt et de le lire

                    with open(ton_fichier.txt, 'r'):
                        data = f.read()
                    print data
                    


                    Moi je suis sous linux, ce qui diffère par rapport à l'encodage par défaut
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      13 août 2011 à 12:08:35

                      Oui la console m'affiche les accents sans d'encode et decode

                      D'ailleur comme j'ai dit plus haut, le read de la commande DOS est écrit niquel dans un fichier texte mais est mal envoyé en donnée...
                      Je trouve ça étrange


                      EDIT :
                      Bon j'ai trouvé la solution mon pti fred :-)
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        13 août 2011 à 15:25:42

                        Eh bien faudrait la donner histoire d'aider ce qui ont le même problème que toi mon ptit guyome ;)
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          13 août 2011 à 15:36:47

                          Oui alors en faite j'ai découvert la fonction readlines (à la place de read) :

                          execute = os.popen(cmd).readlines()
                          


                          Puis j'ai affiché le tableau :
                          print execute

                          C'est la que je me suis rendu compte qu'a chaque fin de ligne il y avais "\n" au lieu de "\r\n" et ça windows il aime pas du tous...

                          Suffisé juste de remplacer \n par \r\n

                          Pour ma part j'ai laissé readlines() sa me permet d'ajouter en début de chaque lignes " >> " se qui fait plus propre :

                          execute = os.popen(cmd)
                          envoi = execute.readlines()
                          
                          for i in range(len(envoi)):
                          conn.send(" >> " + envoi[i].replace("\n","\r\n"))
                          


                          Voilou
                          • Partager sur Facebook
                          • Partager sur Twitter

                          socket et l'encodage

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown