谷歌应用引擎TextProperty和UTF-8:何时进行编码/解码

3

我正在使用Google App Engine 2.5与Django模板和Webapp框架。

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]

根据这个回答 在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')})

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


嗨,苏珊。有趣的问题,但你可能需要包括更多细节,比如你用什么编码来存储数据以及是用于哪种语言,英语还是日语?如果是日语,你是使用UTF-8还是其他什么编码?你总是采用UTF-8格式输入吗,还是混合使用?提供更多细节可以帮助你得到答案。祝好运! - jamesmortensen
1
作为起点,您可以使用内置函数 type 来获取 content 变量的类型:type(content) 将告诉您 cgi.escape 返回的类型。 - Zeugma
@jmort253 我打算保持所有内容都是 UTF-8 格式。HTML 表单采用 UTF-8 编码,且没有使用其他编码方式。 - Susan Mayer
1
你不应该需要(或想要)调用 cgi.escape。永远不要这样做。 - Nick Johnson
@Nick 呃?不需要使用cgi.escape吗?那么请告诉我:https://developers.google.com/appengine/docs/python/gettingstarted/handlingforms中的`self.response.out.write(cgi.escape(self.request.get('content'))) `是什么意思? - Susan Mayer
@SusanMayer 使用具有内置转义功能的模板库是一种不好的替代方案。它被使用的唯一原因是为了使示例更加紧凑,而不是引用外部模板。 - Nick Johnson
2个回答

1

首先,阅读这篇文章还有这篇

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

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

请注意,字节字符串可以存储任何类型的数据 - 编码文本、可执行文件、图像、随机字节、加密数据等等。如果没有元数据,比如它是文本以及所使用的编码方式,你除了存储和检索之外无法做出任何有意义的操作。
不要试图解码 Unicode 字符串或者对字节字符串进行编码;这样做会导致意料之外的结果,事情会变得非常糟糕。
关于数据存储,db.Textunicode 的子类;从所有方面来看,它就是一个 Unicode 字符串 - 它只是不同于其他字符串,因此数据存储可以知道它不应该被索引。同样地,db.Blobstr 的子类,用于存储字节字符串。

0

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