Обработка иностранных символов в HTTP POST с помощью gae python - PullRequest
1 голос
/ 11 сентября 2011

Меня удивляет, что у меня есть 2 функции с HTTP POST, где один разбивает иностранные символы, и я просто делаю self.request.POST.get('text'), чтобы получить значение в обеих функциях.Различие, которое я вижу, состоит в том, что, когда оно ломается, оно наследует blobstoreuploadhandler, поэтому я подозреваю, что это может быть связано с этим изменением.Я, например, не понимаю, почему ÅÄÖ сначала работает, а затем я делаю кажущееся несвязанным изменение, и неожиданно любой не-ASCII-символ искажается.

Пожалуйста, помогите мне понять, как python должен работать с unicode и utf-8.

У меня есть полные 2 примера кода, где один работает, а другой искажает иностранные символы, такие как ÅÄÖ, и мне просто нужно знать, что изменить, и я думаю, что можно настроить его так, чтобы он вел себя так, как ожидалось.

Чтобы точно понять, в чем проблема, может быть, полезно знать, что если я введу ÅÄÖ, то выходной результат станет xcTW, когда он должен быть ÅÄÖ.

2 упомянутых фрагмента кода

class AList(RequestHandler, I18NHandler):
  ...
  a.text = self.request.POST.get('text')

Выше работает.Затем я изменился на

class AList(RequestHandler, I18NHandler, blobstore_handlers.BlobstoreUploadHandler):  
   ...
  a.text = self.request.POST.get('text')

И, похоже, это единственное отличие.У меня есть две идеи: развернуть 2 примера с одним и тем же приложением и посмотреть, что на самом деле вызывает эту проблему, поскольку она может быть или не быть в коде, который я вставляю здесь.

И это также просто производственная проблема, когда локальные иностранные символы работают, как и ожидалось.

Похоже, это связано с использованием blobstoreuploadhandler, поскольку следующее воспроизводит искаженные символы по электронной почте:

class ContactUploadHandler(blobstore_handlers.BlobstoreUploadHandler):
    def post(self):
        message = mail.EmailMessage(sender='admin@myapplicationatappspot.com', subject=self.request.POST.get('subject'))
        message.body = ('%s \nhttp://www.myapplicationatappspot.com/') % ( self.request.POST.get('text') )
        message.to='info@myapplicationatappspot.com'
        message.send()
        self.redirect('/service.html')

Ответы [ 2 ]

1 голос
/ 11 сентября 2011

Похоже, что вы попали в эту ошибку: http://code.google.com/p/googleappengine/issues/detail?id=2749

В качестве обходного пути, пока она не будет исправлена, вы можете закодировать все свои входные данные в base64 с помощью JavaScript.Это не идеально, но это помогло мне.

1 голос
/ 11 сентября 2011

xcTW является результатом кодирования base-64 кодировки cp1252 или latin1 этих 3 символов;см. следующий сеанс IDLE:

>>> import base64; print repr(base64.b64decode('xcTW'))
'\xc5\xc4\xd6'
>>> print repr('ÅÄÖ')
'\xc5\xc4\xd6'
>>>

НО кодировка base-64 также корректирует символы ASCII:

>>> base64.b64encode('abcdef')
'YWJjZGVm'
>>> 

Похоже, вам нужно посмотреть кодировку передачи.

Если вы не можете понять, что происходит, попробуйте опубликовать два своих кода.

Обновление Еще один ход мысли: «капля» - это Двоичный Большой OB, следовательно, кодировка base64 для обеспечения возможности его передачи по сети, которая может быть не 8-битной чистой.Я не уверен, почему вы используете BLOB-объекты, если вы ожидаете текст.Если вам действительно нужно вставить этот третий аргумент, просто используйте base64.b64decode () в возвращаемых байтах.Если ничего не помогает, прочтите документацию gae, чтобы узнать, есть ли способ отключить кодировку base 64.

Еще больше ToT: возможно, blobhandler передает в ASCII, если он подходит, иначе base64-кодирует его - этобудет соответствовать сообщенному поведению.В этом случае вы должны определить кодировку.Я повторяю еще раз: прочитайте документы.

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