3

我在带有 Django 模板和 Webapp 框架的 Google App Engine 2.5 上。

db.TextProperty 和 UTF-8 以及 Unicode 和 Decode/Encode 让我非常困惑。我真的很感谢一些专家可以提供一些建议。我已经用谷歌搜索了一整夜,仍然有很多问题。

我正在尝试做的事情:

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

根据这个答案Zipping together unicode strings in Python

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

以及以 utf-8 格式保存的所有 .py 文件

这是我的代码:

#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')})

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

4

2 回答 2

1

首先,阅读这个而这个

简而言之,每当您在应用程序中处理文本字符串时,它应该是一个 unicode 字符串。当您想将数据作为字节发送时,您应该编码成一个字节字符串(“str”的一个实例而不是“unicode”) - 例如,通过 HTTP,并且当您接收到表示文本的字节时,您应该从字节字符串解码(并且您知道它们的编码)。您应该对包含编码文本的字节字符串执行的唯一操作是对它们进行解码或编码。

幸运的是,大多数框架都做到了这一点。例如,webapp 和 webapp2(我可以看到您正在使用 webapp)应该从所有请求方法返回 unicode 字符串,并对您传递给它们的任何字符串进行适当的编码。确保你负责的所有字符串都是 unicode,你应该没问题。

请注意,字节字符串可以存储任何类型的数据——编码文本、可执行文件、图像、随机字节、加密数据等等。如果没有元数据,例如知道它是文本以及它的编码方式,除了存储和检索它之外,您无法明智地对它做任何事情。

永远不要尝试解码 unicode 字符串或编码字节字符串;它不会像你期望的那样做,事情会变得非常糟糕。

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

于 2012-05-28T07:09:21.107 回答
0

尝试

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

它可以帮助我将 utf-8 文本保存到 TextProperty()

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

于 2012-12-29T07:52:50.110 回答