2011-05-01 108 views
3

我已经尝试了不少于5种不同的“解决方案”,并且无法使用它,请帮助。如何在Google App Engine数据存储区中存储非ASCII字符

这是错误

'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

你应该阅读:HTTP:// blog.notdot.net/2010/07/Getting-unicode-right-in-Python。你需要确保你在处理字节时,在处理字符串时以及在两者之间进行转换时应该使用什么编码。编码/解码错误通常是由于对字符串处理的误解而发生的。 – 2011-05-02 03:40:42

回答

5

的异常是由这行代码升高encode('utf-8')

unicode()函数最终使用ASCII作为默认解码编码;这意味着你的安全只有通过这些类型的值:

  1. Unicode字符串
  2. 一个8位串

您的代码可能传递一个字节的字符串一些编码的unicode(value)失败以ASCII解码。

建议:
如果你正在处理的字节串,你必须知道它们的编码或你的程序将遭受这种编码/解码的问题。

如何解决此问题:
发现你正在处理(UTF-8?)的字节串所用的编码,并将其转换为Unicode字符串。
如果,例如,imdbValues是包含UTF-8编码的字节串一些花哨IMDB Python库返回一个列表,你应该使用它们转换:

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

谢谢,工作完美。 – 2011-05-07 01:12:06

+0

也如果你不介意回答另一个问题,有没有办法做到这一点与列表。 – 2011-05-07 03:00:01

+0

@Jon尝试列表理解:'unicode_list = [item.decode('utf-8')for imdbValues]' – systempuntoout 2011-05-07 11:48:03

2

你应该开始使用unicode您的文本数据。

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

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

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

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

当值传递给movie.director,该值首先被转换以Unicode与:

unicode(value) 

然后它被编码有

相关问题