【问题标题】:Unicode in Python on Google App EngineGoogle App Engine 上 Python 中的 Unicode
【发布时间】:2010-12-22 13:32:11
【问题描述】:

我需要发出一个 POST 请求,其中数据可能是非 ascii(中文、日文字符)。 我需要将输入转换为 unicode 并使用 utf-8 进行编码。我是这样做的:

foo = unicode(self.request.get('foo'), 'utf-8') #convert to unicode
foo = foo.encode('utf-8')                       #encode with utf-8
data = {'foo': foo}
payload = urllib.urlencode(data)

但是,我的日志中不断出现此错误:

TypeError:解码 Unicode 不是 支持

【问题讨论】:

  • 你为什么要从 utf-8 解码,然后再用 utf-8 编码?
  • 我遵循了这个指南:evanjones.ca/python-utf8.html
  • 该指南没有告诉您从 UTF8 解码为 Unicode,然后再将其编码回来。对于您的进一步问题(见下文),我建议您开始一个问题,说明您要解决的问题(不是细节,而是大问题)、您尝试了什么以及为什么没有奏效。跨度>
  • 我想要的只是能够使用非 ascii 字符发出 POST 请求,但我无法进行 urlencode
  • 对,你不能对 unicode 对象进行 urlencode。据我所知,formdata 应该是 UTF8 格式。

标签: python google-app-engine unicode non-ascii-characters


【解决方案1】:

Unicode 无法解码,因为它已经是 unicode。

试试这个:

if isinstance(var, str):
    var = unicode(var, 'utf-8')
else:
    var = unicode(var)

【讨论】:

  • 但我尝试使用正常的 ascii 字符并出现同样的错误
  • @Ngo 这不是关于字符,而是关于字符串的类型
【解决方案2】:

好的一些cmets:

 foo = unicode(self.request.get('foo'), 'utf-8') #convert to unicode

不要称它为“转换”。叫它“解码”,这样更清楚。

 foo = foo.encode('utf-8')                       #encode with utf-8

但是为什么呢?你刚刚解码它 UTF8,你为什么要编码回来?你也可以这样做:

 foo = self.request.get('foo')

相当于上面两行。

为了减少您对 Unicode 的困惑,请阅读以下内容:http://www.joelonsoftware.com/articles/Unicode.html

【讨论】:

  • 感谢您的澄清。我现在如何对非 ascii 字符进行 urlencode 以形成 POST 请求的有效负载?
  • 哦,当然是表格,我的错。我以为你在谈论文件上传,我不知道为什么我这么认为,我的错。我认为表单数据应该是 UTF8。
  • UTF-8 解码-编码循环有一个有效的目的。它将确保字符串中没有 UTF-8 无效的字节序列。在某些情况下,无效的字节序列,特别是超长,可能是一个安全问题。通常最好在应用程序的输入阶段对所有字节数据进行 Unicode 解码,将其作为本机 Unicode 字符串使用,然后在数据离开您的应用程序时编码为所需的编码,进入字节流。
  • 这在 Python 中不会是安全问题,在这种情况下应该在请求发送到的应用程序中进行检查。但当然,在大多数情况下,您会在发送数据之前对其进行处理,在这种情况下,当然应该在输入阶段对其进行解码。
猜你喜欢
  • 1970-01-01
  • 2012-03-10
  • 1970-01-01
  • 2013-04-14
  • 2011-05-30
  • 1970-01-01
  • 2011-05-16
  • 2013-09-14
  • 2018-06-23
相关资源
最近更新 更多