python - Google Datastore 的 UTF-8 Python 问题

标签 python google-app-engine utf-8 ascii google-cloud-datastore

我一直在这些论坛上闲逛,询问有关 Python 和 UTF-8 编码/解码的问题。

这一次我偶然发现了一些最初看起来很简单的问题。

在我之前的问题(http://stackoverflow.com/questions/7138797/problems-with-python-in-google-app-engine-utf-8-and-ascii)中,我问如何确保正确添加UTF-8 字符串到变量:

Messages.append(ChatMessage(chatter, msg))

解决方案是这样的:

Messages.append(ChatMessage(chatter.encode( "utf-8" ), msg.encode( "utf-8" )))

非常简单。

但是,现在我面临着将数据发送到 Google App Engine 数据存储区的挑战。我正在使用的书中的代码(云中的代码)如下所示(我跳过了多余的部分):

#START: ChatMessage
class ChatMessage(db.Model):
    user = db.StringProperty(required=True)
    timestamp = db.DateTimeProperty(auto_now_add=True)
    message = db.TextProperty(required=True)

    def __str__(self):
        return "%s (%s): %s" % (self.user, self.timestamp, self.message)
#END: ChatMessage

# START: PostHandler
class ChatRoomPoster(webapp.RequestHandler):
    def post(self):
        chatter = self.request.get("name")
        msgtext = self.request.get("message")
        msg = ChatMessage(user=chatter, message=msgtext)
        msg.put() #<callout id="co.put"/>
        self.redirect('/')        
# END: PostHandler

我认为用以下位交换 PostHandler 的一部分:

msg = ChatMessage(user=chatter.encode( "utf-8" ), message=msgtext.encode( "utf-8" ))

...就可以了。不幸的是,这并没有发生。我仍然不断得到

File "/base/data/home/apps/s~markcc-chatroom-one-pl/1.353054484690143927/pchat.py", line 147,      in post
msg = ChatMessage(user=chatter.encode( "utf-8" ), message=msgtext.encode( "utf-8" ))

 UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in range(128)

当然,我声明了 (# --coding: utf-8 --) 语句并放置:

self.response.headers['Content-Type'] = 'text/html; charset=UTF-8'

在文件中。它对缓解这个问题没有任何作用。

正如你所看到的,我不太精通 Python,编码/解码问题对我来说有点新奇。我将感谢您的帮助。如果有人可以向我解释在这种情况下我哪里出错了,以及使用什么做法来避免将来出现类似的困境?预先感谢您。

最佳答案

encode 将 unicode 转换为字节,decode 将字节转换为 unicode。你必须小心不要将两者混合。您的错误意味着:

  1. chattermsgtext 已经是字节,并且您正在尝试对其进行编码。 Python 2 最糟糕的“功能”之一是它允许您执行此操作 - 它尝试首先使用 ascii(最受限制的编码)解码字节,然后使用您想要的任何内容重新编码它们已经要求了。此问题已在 Python 3 中修复,但您无法在 App Engine 上使用它。

  2. App Engine 希望存储 unicode ( it does )。因此,您需要向其传递一个 unicode 字符串,而不对其进行编码。事实上,如果您的数据已经在字节串中,则需要先对其进行解码,然后才能存储它。

简而言之,首先要尝试的就是在存储数据之前调用.encode

(我之前可能已经向您指出过,但如果没有,请花时间阅读 this article about unicode )

关于python - Google Datastore 的 UTF-8 Python 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7310151/

相关文章:

python - 谷歌应用程序引擎应用程序错误: 2 nonnumeric port: ''

php - 如何使用 PHP 将 "Western (Mac OS Roman)"格式的文本转换为 UTF-8?

python - 无法使用 selenium 输入凭据

angular - Angular 8到GAE

python - Keras 模型的 predict_proba() 方法不存在

python - Cloud Storage Python 客户端库需要 Ubuntu 14.04 VM 实例上的 memcache 代理

mysql - Rails、MySQL、Unicode 数据和 latin1 表——从这里何去何从?

c++ - 读取 UTF-8 文件

python - TensorFlow:形状错误

python - 如何提取 BeautifulSoup 中 <em> 标签外的文本