如何在Google App Engine数据存储区中存储非ASCII字符

时间:2011-05-01 01:36:39

标签: python google-app-engine google-cloud-datastore ascii

我尝试了不少于5种不同的“解决方案”,我无法让它发挥作用,请帮助。

这是错误

  'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)
  Traceback (most recent call last):
  File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 636, in __call__
    handler.post(*groups)
  File "/base/data/home/apps/elmovieplace/1.350096827241428223/script/pftv.py", line 114, in post
    movie.put()
  File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/db/__init__.py", line 984, in put
    return datastore.Put(self._entity, config=config)
  File "/base/python_runtime/python_lib/versions/1/google/appengine/api/datastore.py", line 455, in Put
    return _GetConnection().async_put(config, entities, extra_hook).get_result()
  File "/base/python_runtime/python_lib/versions/1/google/appengine/datastore/datastore_rpc.py", line 1219, in async_put
    for pbs in pbsgen:
  File "/base/python_runtime/python_lib/versions/1/google/appengine/datastore/datastore_rpc.py", line 1070, in __generate_pb_lists
    pb = value_to_pb(value)
  File "/base/python_runtime/python_lib/versions/1/google/appengine/api/datastore.py", line 239, in entity_to_pb
    return entity._ToPb()
  File "/base/python_runtime/python_lib/versions/1/google/appengine/api/datastore.py", line 841, in _ToPb
    properties = datastore_types.ToPropertyPb(name, values)
  File "/base/python_runtime/python_lib/versions/1/google/appengine/api/datastore_types.py", line 1672, in ToPropertyPb
    pbvalue = pack_prop(name, v, pb.mutable_value())
  File "/base/python_runtime/python_lib/versions/1/google/appengine/api/datastore_types.py", line 1485, in PackString
    pbvalue.set_stringvalue(unicode(value).encode('utf-8'))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

这是代码中给我带来问题的一部分。

if imdbValues[5] == 'N/A':
    movie.diector = ''
else:
    movie.director = imdbValues[5]

...

movie.put()

在这种情况下,imdbValues[5]等于Claudio Fäh

2 个答案:

答案 0 :(得分:5)

这行代码引发了异常:

pbvalue.set_stringvalue(unicode(value).encode('utf-8'))

当您将值传递给movie.director时,该值首先在unicode中转换为:

unicode(value)

然后用encode('utf-8')进行编码。

unicode()函数使用ASCII作为默认解码编码;这意味着只有通过这些价值才能安全:

  1. 一个unicode字符串
  2. 8位字符串
  3. 您的代码可能传递了一个字节字符串,其中包含unicode(value)无法以ASCII格式解码的某些编码。

    建议:
    如果您正在处理字节字符串,您必须知道它们的编码,否则您的程序将遇到这种编码/解码问题。

    如何修复它:
    发现你正在处理的字节串中使用的编码(utf-8?)并将它们转换为unicode字符串 例如,如果imdbValues是包含utf-8编码字节字符串的某些花哨的 Imdb python库返回的列表,则应使用以下命令转换它们:

     movie.director = imdbValues[5].decode('utf-8')
    

答案 1 :(得分:2)

您应该开始使用unicode作为文字数据。

无论您获取数据,它们都是以字节编码的Unicode字符。编码可以是UTF-8UTF-16Windows-1252ISO-8859-1或其他许多编码。如果您的系统上存在数据,则您知道编码。如果它们来自网页,则编码包含在响应标头中,并且通常位于页面的开头。使用该编码.decode到非常有用的unicode Python对象,并在代码中使用它。

对输入进行解码,对输出进行编码(如果需要)。在使用App Engine数据之前无需进行编码。

与Unicode相关的问题中的PS that答案可能会有所帮助。