如何在Python中将Unicode字符串(来自JSON)编码为'utf-8'?

3

我正在使用Flask-Python创建一个REST API。其中一个url(/uploads)接收(POST HTTP请求)和JSON '{"src":"void", "settings":"my settings"}'。我可以单独提取每个对象并将其编码为字节字符串,然后可以在Python中使用hashlib进行哈希。但是,我的目标是将整个字符串编码,使其看起来像...myfile.encode('utf-8')。打印myfile显示如下>> {u'src':u'void', u'settings':u'my settings'},是否有任何方法可以将上述unicode字符串编码为utf-8以获得用于hashlib.sha1(mayflies.encode('uff-8')的字节序列?请让我知道需要更多澄清。先感谢您。

fileSRC = request.json['src']
fileSettings = request.json['settings']

myfile = request.json
print myfile

#hash the filename using sha1 from hashlib library
guid_object = hashlib.sha1(fileSRC.encode('utf-8')) // this works however I want myfile to be encoded not fileSRC
guid = guid_object.hexdigest() //this works 
print guid

1
澄清一下:您是否想将json转换为字符串并对其进行哈希处理? - bwarren2
嗨,谢谢你的回复。我从你的问题中得到了答案,现在它可以工作了。非常感谢你。 - divspec
我使用了...jsonContent = json.dumps(request.json)..然后guid_object = hashlib.sha1(jsonContent.encode('utf-8'))。现在它可以正常工作了。 - divspec
1个回答

1

正如您在评论中所提到的,您使用以下方法解决了您的问题:

jsonContent = json.dumps(request.json)
guid_object = hashlib.sha1(jsonContent.encode('utf-8'))

但是理解这个原因很重要。Flask 对于非ASCII字符发送unicode(),对于ASCII字符发送str()。使用JSON转储结果将给出一致的结果,因为它抽象了内部Python表示,就像您只有unicode()一样。

Python 2

在Python 2(您正在使用的Python版本)中,您不需要.encode('utf-8'),因为json.dumps()ensure_ascii默认值为True。当您向json.dumps()发送非ASCII数据时,它将使用JSON转义序列实际转储ASCII:无需编码为UTF-8。此外,由于Python之禅说“明确优于隐式”,即使ensure_ascii已经是True,您也可以指定它:

jsonContent = json.dumps(request.json, ensure_ascii=True)
guid_object = hashlib.sha1(jsonContent)

Python 3

然而,在Python 3中,这将不再起作用。实际上,json.dumps()在Python 3中返回unicode,即使unicode字符串中的所有内容都是ASCII。但是hashlib.sha1仅适用于bytes。您需要明确进行转换,即使您只需要ASCII编码:

jsonContent = json.dumps(request.json, ensure_ascii=True)
guid_object = hashlib.sha1(jsonContent.encode('ascii'))

这就是为什么Python 3更好的原因:它强制你更明确地表达所使用的文本,无论是str(Unicode)还是bytes。这避免了许多问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接