我正在尝试比较两个字符串,第一个字符串s1来自mongoengine,第二个字符串s2来自Django http请求。
他们看起来像这样:
>>> s1 = product_model.Product.objects.get(pk=1).name
>>> s1
u'Product \xe4 asdf'
>>> s2 = request.POST['name']
>>> s2
'Product \xc3\xa4 asdf'
它们中有相同的字母,瑞典语'ä',但mongoengines(s1)是Python unicode字符串,Djangos(s2)是Python字节串,带有unicode编码字符。
我可以通过例如将Python unicode字符串转换为字节字符串
>>> s1.encode('utf-8') == s2
True
但是我想最好的做法是让我的所有Python字符串在我的系统中以相同的方式编码,对吗?
如何告诉Django使用Python unicode字符串呢?或者我如何告诉MongoEngine使用unicode编码的Python字节串?
答案 0 :(得分:2)
Django文档说:
一般字符串处理
每当你使用Django的字符串时 - 例如,在数据库查找中, 模板渲染或其他任何地方 - 你有两个选择 编码那些字符串。您可以使用Unicode字符串,也可以使用 使用编码的普通字符串(有时称为“字节串”) UTF-8。
在Python 3中,逻辑是相反的,即正常的字符串 Unicode,当你想专门创建一个bytestring时,你 必须在字符串前加上'b'。正如我们在Django代码中所做的那样 从版本1.5开始,我们建议您从中导入unicode_literals 代码中的 future 库。然后,当你特别想要的时候 要创建一个bytestring文字,请在字符串前加上'b'。
Python 2遗产:
my_string = "This is a bytestring" my_unicode = u"This is an Unicode string"
带有unicode文字的Python 2或Python 3:
from __future__ import unicode_literals my_string = b"This is a bytestring" my_unicode = "This is an Unicode string"
如果您使用的是Python 2,则可以尝试使用它。正如我在评论中所说:
我不建议使用编码字符串。像这片一样说 (farmdev.com/talks/unicode)“早期解码,Unicode无处不在,编码 迟到了“。所以我建议你告诉Django使用unicode字符串, 但我不是Django专家,抱歉。我的方法:s1 == s2.decode(“utf8”),因此您可以使用两个Unicode字符串
希望它有效
编辑:我想你正在使用Django的HttpRequest,所以来自文档:HttpRequest.encoding
表示当前使用的编码的字符串 解码表单提交数据(或无,这意味着 使用DEFAULT_CHARSET设置)。您可以将此属性写入 更改访问表单数据时使用的编码。任何后续的 属性访问(例如从GET或POST读取)将使用新的 编码值。如果您知道表单数据不在 DEFAULT_CHARSET编码。