web-dev-qa-db-ja.com

「TypeError:エンコードなしの文字列引数」ですが、文字列はエンコードされていますか?

既存のプログラム をPython2からPython3に変換する作業をしています。プログラムのメソッドの1つは、リモートサーバーでユーザーを認証します。ユーザーにパスワードの入力を求めます。

_def _handshake(self):
    timestamp = int(time.time())
    token = (md5hash(md5hash((self.password).encode('utf-8')).hexdigest()
                + str(bytes('timestamp').encode('utf-8'))))
    auth_url = "%s/?hs=true&p=1.2&u=%s&t=%d&a=%s&c=%s" % (self.name,
                                                          self.username,
                                                          timestamp,
                                                          token,
                                                          self.client_code)
    response = urlopen(auth_url).read()
    lines = response.split("\n")
    if lines[0] != "OK":
        raise ScrobbleException("Server returned: %s" % (response,))
    self.session_id = lines[1]
    self.submit_url = lines[3]
_

この方法の問題は、整数を文字列に変換した後、エンコードする必要があることです。しかし、私が知る限り、それはすでにエンコードされていますか? この質問 を見つけましたが、それをこのプログラムのコンテキストに適用するのに苦労していました。

これは私に問題を与える線です。

  • + str(bytes('timestamp').encode('utf-8'))))
    • _TypeError: string argument without an encoding_

私はこれを行う別の方法を試してみましたが、すべてさまざまな種類のエラーがありました。

  • + str(bytes('timestamp', 'utf-8'))))
    • _TypeError: Unicode-objects must be encoded before hashing_
  • + str('timestamp', 'utf-8')))
    • _TypeError: decoding str is not supported_

私はまだ学習を始めていますPython(ただし、Javaの初心者から中級の知識があります)ので、まだ言語に完全に精通していません。この問題が何であるかについて誰かが考えていますか?でしょうか?

ありがとう!

5
Justin W. Flory

このエラーは、python 3でバイトを作成する方法が原因です。

bytes("bla bla")ではなく_b"blabla"_を実行するか、配列に変換する前に元のエンコードが何であったかを知る必要があるため、bytes("bla bla","utf-8")のようなエンコードタイプを指定する必要があります数の。

その後、エラー

_TypeError: string argument without an encoding
_

消えるはずです。

バイトまたはstrのいずれかがあります。バイト値があり、それをstrに変換したい場合は、次のようにする必要があります。

_my_bytes_value.decode("utf-8")
_

そしてそれはあなたにstrを返します。

お役に立てば幸いです。ごきげんよう !

11
Oekhny