我一直在这些论坛上闲逛,询问有关 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。你必须小心不要将两者混合。您的错误意味着:
chatter
或msgtext
已经是字节,并且您正在尝试对其进行编码。 Python 2 最糟糕的“功能”之一是它允许您执行此操作 - 它尝试首先使用 ascii(最受限制的编码)解码字节,然后使用您想要的任何内容重新编码它们已经要求了。此问题已在 Python 3 中修复,但您无法在 App Engine 上使用它。App Engine 希望存储 unicode ( it does )。因此,您需要向其传递一个 unicode 字符串,而不对其进行编码。事实上,如果您的数据已经在字节串中,则需要先对其进行解码,然后才能存储它。
简而言之,首先要尝试的就是在存储数据之前不调用.encode
。
(我之前可能已经向您指出过,但如果没有,请花时间阅读 this article about unicode )
关于python - Google Datastore 的 UTF-8 Python 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7310151/