Как сохранить не-ASCII символ в хранилище данных Google App Engine - PullRequest
3 голосов
/ 01 мая 2011

Я пробовал не менее 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 ]

5 голосов
/ 03 мая 2011

Исключением является эта строка кода:

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

Когда вы передаете значение в movie.director, это значение сначала преобразуется в Unicode с помощью:

unicode(value)

затем кодируется с помощью encode('utf-8').

. Функция unicode() обычно использует ASCII в качестве кодировки декодирования по умолчанию;это означает, что вы в безопасности, только передавая такие значения:

  1. Строка Unicode
  2. 8-битовая строка

Ваш код, вероятно, передаетстрока байтов с некоторой кодировкой, которую unicode(value) не удается декодировать в ASCII.

Рекомендация:
если вы имеете дело с байтовыми строками, вы ДОЛЖНЫ знать их кодировку или ваша программа будет сталкиваться с такой проблемой кодирования / декодирования.

Как ее исправить:
обнаружить кодировку, используемую в байтовых строках, с которыми вы имеете дело (utf-8?) И преобразовать их в строки Unicode.
Если, например, imdbValues - это список, возвращаемый некоторыми причудливыми библиотеками Python Imdb , который содержит байтовые строки в кодировке utf-8, вам следует преобразовать ихиспользуя:

 movie.director = imdbValues[5].decode('utf-8')
2 голосов
/ 01 мая 2011

Вы должны начать использовать unicode для своих текстовых данных.

Везде, где вы получаете свои данные, они представляют собой символы Юникода, закодированные в байтах.Кодировка может быть UTF-8, или UTF-16, или Windows-1252, или ISO-8859-1, или многими другими кодировками.Если данные существуют в вашей системе, вы знаете кодировку.Если они пришли с веб-страницы, кодировка включается в заголовки ответа и часто в начало страницы.Используя эту кодировку, .decode получите очень полезный unicode объект Python и используйте его в своем коде.

Декодируйте на входе, кодируйте (при необходимости) на выходе.Нет необходимости кодировать перед использованием данных с App Engine.

PS , что ответ на вопрос, связанный с Unicode, может помочь.

...