谷歌应用程序引擎TextProperty和UTF-8:当编码/解码(Google App Engin

2019-07-29 13:42发布

我对谷歌App Engine的2.5 Django的模板和框架的webapp。

该db.TextProperty和UTF-8和Unicode和解码/编码搞糊涂了这么多。 我真的很感激一些专家可以提供一些建议。 我用Google搜索了整整一夜,仍然有这么多问题。

我所试图做的事:

[utf-8 form input] => [Python, Store in db.TextProperty] => [When Needed, Replace Japanese with English] => [HTML, UTF-8]

根据这个答案荏苒在Python一起unicode字符串

# -*- coding: utf-8 -*-

和所有.py文件保存为UTF-8格式

这里是我的代码:

#Model.py
class MyModel(db.Model):
  content = db.TextProperty()

#Main.py
def post(self):
    content=cgi.escape(self.request.get('content'))
    #what is the type of content? Unicode? Str? or Other?
    obj = MyModel(content=content)
    #obj = MyModel(content=unicode(content))
    #obj = MyModel(content=unicode(content,'utf-8'))
    #which one is the best?
    obj.put()

#Replace one Japanese word with English word in the content
content=obj.content
#what is the type of content here? db.Text? Unicode? Str? or Other?
#content=unicode(obj.content, 'utf-8') #Is this necessary?
content=content.replace(u'ひと',u'hito')

#Output to HTML
self.response.out.write(template.render(path, {'content':content})
#self.response.out.write(template.render(path, {'content':content.encode('utf-8')})

希望一些谷歌的App Engine的工程师可以看到这个问题,并提供了一些帮助。 非常感谢!

Answer 1:

首先, 看这个 。 而这个 。

简而言之,当你正在处理您的应用程序的文本字符串,它应该是一个unicode字符串。 当您要发送数据字节,您应该编码成字节串(而不是“统一”海峡'的实例) - 例如,通过HTTP,当你收到代表文本的字节,你应该从一个字节的字符串解码(你知道他们的编码)。 你都不应当在包含编码文本的字节字符串做的操作只有解码或对其进行编码。

幸运的是,大多数的框架得到这个权利; Web应用程序和webapp2的,比如(我可以看到你正在使用的Web应用程序)应该从所有的请求方法返回Unicode字符串,并进行编码你适当地传递给他们的任何字符串。 确保所有的字符串你负责的unicode的,你应该罚款。

需要注意的是一个字节的字符串可以存储任何类型的数据 - 编码的文本,可执行文件,图像,随机字节,加密的数据,等等。 没有元数据,如知识,它的文字,什么编码它在,你不能理智地用它做任何事情比其他商店和检索。

永远不要试图解码unicode字符串,或编码字节串; 它不会做你所期望的,事情会去可怕的错误。

关于数据存储区, db.Text是的一个子类unicode ; 所有意图和目的,它一个Unicode字符串-它只是不同的,因此数据存储可以告诉它不应该被索引。 同样地, db.Blob是的一个子类str ,用于存储字节串。



Answer 2:

尝试

db.Text("text", encoding="utf-8")

它帮助我为UTF-8文本保存到TextProperty()

有关详情,请参考以下链接: https://developers.google.com/appengine/docs/python/datastore/typesandpropertyclasses?hl=en#Text



文章来源: Google App Engine TextProperty and UTF-8: When to Encode/Decode