“TypeError:没有编码的字符串参数”,但字符串是否已编码?

时间:2016-06-02 20:46:00

标签: python string python-3.x encoding utf-8

我正在努力将existing program从Python2转换为Python3。程序中的一种方法使用远程服务器对用户进行身份验证。它将提示用户输入密码。

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]

此方法的问题是在将整数转换为字符串后,需要对其进行编码。但据我所知,它已经编码了?我发现this question但我很难将其应用到此程序的上下文中。

这就是给我带来问题的路线。

  • + 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的中级知识),所以我还不完全熟悉这门语言。有没有人对这个问题有什么想法?

谢谢!

1 个答案:

答案 0 :(得分:11)

此错误是由于您在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")

它会让你回复一下。

我希望它有所帮助!祝你今天愉快 !