Символы Юникода с BlobStore в App Engine - PullRequest
2 голосов
/ 04 апреля 2011

Есть ли способ хранения данных Unicode в BlobStore App Engine (на Python)?

Я сохраняю такие данные

file_name = files.blobstore.create(mime_type='application/octet-stream')
with files.open(file_name, 'a') as f:
     f.write('<as><a>' + '</a><a>'.join(stringInUnicode) + '</a></as>')

Но на производстве (не на разработке)Сервер я получаю эту ошибку.Кажется, он конвертирует мой Unicode в ASCII, и я не знаю почему.

Почему он пытается конвертировать обратно в ASCII?Могу ли я избежать этого?

    Traceback (most recent call last):
 File "/base/data/home/apps/myapp/1.349473606437967000/myfile.py", line 137, in get
   f.write('<as><a>' + '</a><a>'.join(stringInUnicode) + '</a></as>')
 File "/base/python_runtime/python_lib/versions/1/google/appengine/api/files/file.py", line 364, in write
   self._make_rpc_call_with_retry('Append', request, response)
 File "/base/python_runtime/python_lib/versions/1/google/appengine/api/files/file.py", line 472, in _make_rpc_call_with_retry
   _make_call(method, request, response)
 File "/base/python_runtime/python_lib/versions/1/google/appengine/api/files/file.py", line 226, in _make_call
   rpc.make_call(method, request, response)
 File "/base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_stub_map.py", line 509, in make_call
   self.__rpc.MakeCall(self.__service, method, request, response)
 File "/base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_rpc.py", line 115, in MakeCall
   self._MakeCallImpl()
 File "/base/python_runtime/python_lib/versions/1/google/appengine/runtime/apiproxy.py", line 161, in _MakeCallImpl
   self.request.Output(e)
 File "/base/python_runtime/python_lib/versions/1/google/net/proto/ProtocolBuffer.py", line 204, in Output
   self.OutputUnchecked(e)
 File "/base/python_runtime/python_lib/versions/1/google/appengine/api/files/file_service_pb.py", line 2390, in OutputUnchecked
   out.putPrefixedString(self.data_)
 File "/base/python_runtime/python_lib/versions/1/google/net/proto/ProtocolBuffer.py", line 432, in putPrefixedString
   v = str(v)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 313: ordinal not in range(128)

1 Ответ

5 голосов
/ 04 апреля 2011

Хранилище больших двоичных объектов содержит двоичные данные: байты, а не символы.Так что вам придется выполнить какой-то шаг кодирования.utf-8 кажется такой же хорошей кодировкой, как и любая.

f.write('<as><a>' + '</a><a>'.join(stringInUnicode) + '</a></as>')

Это пойдет не так, если элемент в stringInUnicode содержит последовательности <, & или ]]>.Вам может понадобиться экранирование (либо с использованием надлежащей библиотеки XML для сериализации данных, либо вручную):

with files.open(file_name, 'a') as f:
    f.write('<as>')
    for line in stringInUnicode:
        line= line.replace(u'&', u'&amp;').replace(u'<', u'&lt;').replace(u'>', u'&gt;');
        f.write('<a>%s</a>' % line.encode('utf-8'))
    f.write('</as>')

(Это все равно будет некорректно сформированный XML, если строки когда-либо содержат управляющие символы,но с этим ничего не поделаешь. Если вам нужно сохранить произвольный двоичный файл в XML, вам понадобится специальная кодировка, такая как base-64 сверху.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...