我现在正在构建一个脚本,我遇到了一些麻烦。我正在使用Python-BitcoinRPC(JSON-RPC的一个分支) - 但我的Python经验非常有限,而且我的文本编码经验甚至更多,所以请耐心等待。
一位朋友想卖掉他的钱币,但却记不起钱包的钥匙。我已经构建了一个脚本来尝试他所有常用密码的各种组合和排列,但我们还没有想出任何东西。现在我们尝试一些稍微晦涩的字符,比如“¿”。问题是,如果我将“¿”放入一个字符串并回显它,它就会变成“┬┐” - 这与比特币守护进程的“¿”不同(我们已经创建了一个测试钱包键“¿abc”,如果我们将其作为字符串文字传递给守护进程,我们就无法取消它。
这也会抛出我的脚本,因为它会随机播放单个字符,因此将“┬┐”视为两个字符,并导致脚本崩溃,“'utf8'编解码器无法解码位置10中的字节0xc2:无效延续byte“(虽然如果我使用包含”¿“的字符串文字,我不会得到这个。)
我有点超出我的深度,我希望有人可以提供帮助。当python将这些字符转换为多字符字符串时会发生什么?如何将它作为参数逐字传递,以及字符串操作将它们视为单个字符串?
这里有一些代码可以解释我的意思:
# -*- coding: utf-8 -*-
import bitcoinrpc
import sys
word = "abc"
chars = "¿?!"
phrase_a = chars[0:1] + word # = ┬abc, error: 'utf8' codec can't decode byte 0xc2 in position 0: invalid continuation byte
phrase_b = chars[1:2] + word # = ┐abc, error: 'utf8' codec can't decode byte 0xbf in position 0: invalid start byte
phrase_c = chars[2:3] + word # = ?abc, no error, but would expect the result to be "!abc"
phrase_d = chars + word # = ┬┐?!abc, no error
rpc_username = "bitcoinrpc"
rpc_password = "somepassword"
btc_conn = bitcoinrpc.connect_to_remote(rpc_username, rpc_password, host="localhost", port=8332, use_https=False)
try:
btc_conn.walletpassphrase(phrase_b, 20)
except bitcoinrpc.exceptions.WalletPassphraseIncorrect:
print "Phrase incorrect"
sys.exit(0)
except Exception as e:
print str(e)
sys.exit(0)
print "Phrase correct"
任何帮助将不胜感激!
答案 0 :(得分:1)
通过添加u
前缀
>>> chars = u"¿?!"
>>> print chars[0]
¿
这样Python就知道将值作为多字节字符处理,而不是试图将其作为单字节字符序列进行操作。