3

これが私のコードです:

def renren_get_sig(params):
    cat_params = ''.join([u'%s=%s'%(unicode(k), unicode(params[k])) for k in sorted(params)])
    sig = hashlib.md5(u"%s%s"%(unicode(cat_params), unicode(SEC_KEY))).hexdigest()
    return sig

例外メッセージは次のとおりです。

例外タイプ: UnicodeEncodeError
例外値: 'ascii' コーデックは位置 138-141 の文字をエンコードできません: 序数が範囲内にありません (128)

dic params の値は次のとおりです。

params ={
'access_token':u'195036|6.3cf38700f.2592000.1347375600-462350295',
 'action_link': u'http://wohenchun.xxx.com',
 'action_name': u'\u6d4b\u8bd5\u4e00\u4e0b',
 'api_key': u'8c0a2cded4f84bbba4328ccba22c3374',
 'caption': u'\u7eaf\u6d01\u6307\u6570\u6d4b\u8bd5',
 'description': u'\u4e16\u754c\u8fd9\u4e48\u4e71\uff0c\u88c5\u7eaf\u7ed9\u8c01\u770b\uff1f\u5230\u5e95\u4f60\u6709\u591a\u5355\u7eaf\uff0c\u8d85\u7ea7\u5185\u6db5\u7684\u4f60\uff0c\u6562\u4e0d\u6562\u6311\u6218\u8d85\u7ea7\u5185\u6db5\u7684\u9898\u76ee?\u4e0d\u7ba1\u4f60\u6d4b\u4e0d\u6d4b\uff0c\u53cd\u6b63\u6211\u662f\u6d4b\u4e86\uff01',
 'format': u'JSON',
 'image': u'http://hdn.xnimg.cn/photos/hdn21/20120809/1440/h0dd1376.jpg',
 'message': u'\u5c3c\u?!! \u3010\u4f60\u96be\u9053\u6bd4\u6211\u66f4\u7eaf\u6d01\u4e48,\u6765\u6d4b\u8bd5\u4e00\u4e0b\u5427!\u4f20\u9001\u95e8 >>  http://wohenchun.jiongceyan.com \u3011\r\n\t\t\t\t\t\t\t\t\t\t',
 'method': u'feed.publishFeed',
 'name': u'\u4eba\u4eba\u53f2\u4e0a\u6700\u706b\u7206\u6d4b\u8bd5\u4e4b\u5355\u7eaf\u6d4b\u8bd5',
 'url': u'http://wohenchun.xxx.com',
 'v': u'1.0'} 

params のすべてのキーと値のペアは Unicode オブジェクトです。なぜ私はまだそのような例外を受け取るのですか?

ありがとうございました!

4

2 に答える 2

8

Unicode が問題です。ハッシュ アルゴリズムは、Unicode コード ポイントではなく、バイトで使用するように設計されています。したがって、ハッシュ アルゴリズムを適用する前に、エンコーディングを選択して Unicode 文字列をバイト文字列にエンコードする必要があります。

from hashlib import md5 

str_to_hash = unicode_str.encode('utf-8')
md5(str_to_hash).hexdigest()

Python トラッカーでこの問題に関する問題が発生しました。詳細については調査してください。

于 2012-08-12T15:20:41.497 に答える
1

@Rostyslavはそれを正しく持っています。hashlib でバイト文字列を使用します。読みやすくするために、ソース ファイルのエンコーディングを使用することをお勧めしますか? パラメータを確認してmessageください。元のコードには文字列にエラーがあり\u?!!ました。私はそれを省略しました:

# coding: utf8
import hashlib

SEC_KEY = 'salt'

params = {
    u'access_token' : u'195036|6.3cf38700f.2592000.1347375600-462350295',
    u'action_link' : u'http://wohenchun.xxx.com',
    u'action_name' : u'测试一下',
    u'api_key' : u'8c0a2cded4f84bbba4328ccba22c3374',
    u'caption' : u'纯洁指数测试',
    u'description' : u'世界这么乱,装纯给谁看?到底你有多单纯,超级内涵的你,敢不敢挑战超级内涵的题目?不管你测不测,反正我是测了!',
    u'format' : u'JSON',
    u'image' : u'http://hdn.xnimg.cn/photos/hdn21/20120809/1440/h0dd1376.jpg',
    u'message' : u'尼【你难道比我更纯洁么,来测试一下吧!传送门 >>  http://wohenchun.jiongceyan.com 】\r\n\t\t\t\t\t\t\t\t\t\t',
    u'method' : u'feed.publishFeed',
    u'name' : u'人人史上最火爆测试之单纯测试',
    u'url' : u'http://wohenchun.xxx.com',
    u'v' : u'1.0'}

def renren_get_sig(params):
    data = u''.join(u'{0}={1}'.format(k,v) for k,v in sorted(params.items()))
    return hashlib.md5(data.encode('utf8') + SEC_KEY).hexdigest()

print renren_get_sig(params)

出力:

085b14d1384ba805d2d5d5e979913b27
于 2012-08-12T16:06:31.830 に答える