使用Django和MongoEngine在python中使用Unicode

时间:2013-12-05 14:49:25

标签: python django mongoengine

我正在尝试比较两个字符串,第一个字符串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字节串?

1 个答案:

答案 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编码。