非ASCII字符转换为多字节ASCII

时间:2013-11-19 08:33:46

标签: python json utf-8

我现在正在构建一个脚本,我遇到了一些麻烦。我正在使用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"

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

通过添加u前缀

来使用Unicode字符串文字
>>> chars = u"¿?!"
>>> print chars[0]
¿

这样Python就知道将值作为多字节字符处理,而不是试图将其作为单字节字符序列进行操作。