2012-02-10 12 views
3

は私の問題です...PythonのUnicodeのアスキー、序ない範囲で、イライラエラーここ

データベースは、Unicodeのすべてを格納します。 hashlib.sha256()。digest()はstrを受け取り、strを返します。

私はデータをハッシュ関数を詰め込むしようとすると、私は有名なエラーを取得する:

UnicodeDecodeError: 'ascii' codec can't decode byte 0x90 in position 1: ordinal not in range(128) 

これは、だから私が求めていますがすべてオンにする方法である私のデータ

>>> db_digest 
u"'\x90\x017~1\xe0\xaf4\xf2\xec\xd5]:j\xef\xe6\x80\x88\x89\xfe\xf7\x99,c\xff\xb7\x06hXR\x99\xad\x91\x93lM:\xafT\xc9j\xec\xc3\xb7\xea[\x80\xe0e\xd6\\\xd8\x16'\xcb6\xc8\xaa\xdf\xc9 :\xff" 
>>> 
>>> hashlib.sha256(db_digest) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeEncodeError: 'ascii' codec can't encode character u'\x90' in position 1: ordinal not in range(128) 
>>> 
>>> asc_db_digest 
"'\x90\x017~1\xe0\xaf4\xf2\xec\xd5]:j\xef\xe6\x80\x88\x89\xfe\xf7\x99,c\xff\xb7\x06hXR\x99\xad\x91\x93lM:\xafT\xc9j\xec\xc3\xb7\xea[\x80\xe0e\xd6\\\xd8\x16'\xcb6\xc8\xaa\xdf\xc9 :\xff" 
>>> hashlib.sha256(asc_db_digest) 
<sha256 HASH object @ 0x7f7da0f04300> 

ですasc_db_digestにdb_digest

編集 私がtehのを認識していないようだと私は質問を言い換えています問題は最初の場所で正しく。

+0

知っていいだろう*なぜ* hexまたはbase64はオプションではないので、これが最善の方法です。 P.S.私の答えの2番目の部分を見ましたか? –

+0

@ MarkRansom私は質問を完全に言い直しました。内部を参照してください。 –

答えて

5

あなただけがraw_unicode_escapeエンコーディングを使用してPythonのSTRに変換することができ、0から255(バイト)へのコード・ポイントが含まれているUnicode文字列を使用している場合:

>>> db_digest = u"'\x90\x017~1\xe0\xaf4\xf2\xec\xd5]:j\xef\xe6\x80\x88\x89\xfe\xf7\x99,c\xff\xb7\x06hXR\x99\xad\x91\x93lM:\xafT\xc9j\xec\xc3\xb7\xea[\x80\xe0e\xd6\\\xd8\x16'\xcb6\xc8\xaa\xdf\xc9 :\xff" 
>>> hash_digest = "'\x90\x017~1\xe0\xaf4\xf2\xec\xd5]:j\xef\xe6\x80\x88\x89\xfe\xf7\x99,c\xff\xb7\x06hXR\x99\xad\x91\x93lM:\xafT\xc9j\xec\xc3\xb7\xea[\x80\xe0e\xd6\\\xd8\x16'\xcb6\xc8\xaa\xdf\xc9 :\xff" 
>>> db_digest.encode('raw_unicode_escape') 
"'\x90\x017~1\xe0\xaf4\xf2\xec\xd5]:j\xef\xe6\x80\x88\x89\xfe\xf7\x99,c\xff\xb7\x06hXR\x99\xad\x91\x93lM:\xafT\xc9j\xec\xc3\xb7\xea[\x80\xe0e\xd6\\\xd8\x16'\xcb6\xc8\xaa\xdf\xc9 :\xff" 
>>> db_digest.encode('raw_unicode_escape') == hash_digest 
True 
+1

あなたは今年のデコーダです;-) –

3

ハッシュバイト(Pythonの2.xでbytesstr)、ない文字列(2.xでunicode、3.xではstr)上で動作します。したがって、とにかくバイトを供給する必要があります。試してください:

hashlib.sha1(salt.encode('utf-8') + data).digest() 
+0

'salt.encode( 'utf-8')!= salt'となり、一致すると失敗します。 'hexdigest'もオプションではありません。私が必要とするのは' db_digest'を 'hash_digest'に変換する方法です(私の質問ではvars) –

+0

@TzuryBarYochay次に、データベース内のsaltに使われるエンコーディングを調べる必要があります。ありがとうFJ。 – lvc

1

ハッシュには0-255の範囲の「文字」が含まれます。これらはすべて有効なUnicode文字ですが、Unicode文字列ではありません。あなたは何とかそれを変換する必要があります。最高の解決策は、base64のようなものにエンコードすることです。

ハックソリューションは、バイトを変換することもありますが、データベースがそれをやっているように見えるとおりに、擬似Unicode文字列に直接返さ:

hash_unicode = u''.join([unichr(ord(c)) for c in hash_digest]) 

また、他の道を行くことができますが、これはあります「文字列」にASCIIの0〜127の範囲外の文字が含まれ、使用しようとするとエラーが発生する可能性があるため、より危険です。

asc_db_digest = ''.join([chr(ord(c)) for c in db_digest]) 
関連する問題