Я новичок в расширениях Chrome и только что создал всплывающее окно, которое при отправке через Javascript отправляет информацию в скрипт Python в GAE, который работает с данными. Теперь все работает отлично, пока я не использую специальные символы, такие как Ä, Ö, Ü. Когда я использую эти буквы, я получаю сообщение об ошибке:

Traceback (most recent call last):
  File "/python27_runtime/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1535, in __call__
    rv = self.handle_exception(request, response, e)
  File "/python27_runtime/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1529, in __call__
    rv = self.router.dispatch(request, response)
  File "/python27_runtime/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1278, in     default_dispatcher
    return route.handler_adapter(request, response)
  File "/python27_runtime/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1102, in __call__
return handler.dispatch()
  File "/python27_runtime/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 572, in dispatch
return self.handle_exception(e, self.app.debug)
  File "/python27_runtime/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 570, in dispatch
return method(*args, **kwargs)
  File "/base/data/home/apps/s~google.com:finaggintel/1.368063289009985228/main.py", line 115, in post
t.title = self.request.get('title').encode('utf-8')
  File "/python27_runtime/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 175, in get
param_value = self.get_all(argument_name)
  File "/python27_runtime/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 212, in get_all
param_value = self.params.getall(argument_name)
  File "/python27_runtime/python27_lib/versions/third_party/webob-1.1.1/webob/multidict.py", line 327, in getall
return map(self._decode_value, self.multi.getall(self._encode_key(key)))
  File "/python27_runtime/python27_lib/versions/third_party/webob-1.1.1/webob/multidict.py", line 301, in _decode_value
value = value.decode(self.encoding, self.errors)
  File "/python27_runtime/python27_dist/lib/python2.7/encodings/utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xdc in position 0: unexpected end of data    

Откровенно говоря - понятия не имею, где эту проблему отлаживать. Я пробовал расшифровывать и кодировать utf-8 на Python (но, опять же, для меня это в новинку):

class News(webapp2.RequestHandler):
def post(self):     
    try: 
        user_job = joblist[user][0]
        user_pod = joblist[user][1]
    except KeyError:
        user_job = 'Guest'
        user_pod = 'Guest'

    link = self.request.get('link').encode('utf-8')

    if 'http' not in self.request.get('link'):
        link ='http://'+self.request.get('link')
    else:
        link = self.request.get('link')

    t = NewsBase(parent=news_key('finaggnews'))
    t.user = user
    t.date = datetime.now()
    t.text = self.request.get('text').encode('utf-8')
    t.title = self.request.get('title').encode('utf-8')
    t.link = link
    t.upvotes = []
    t.downvotes = []
    t.put()

Я делаю что-то неправильно? Я вообще близок к проблеме? Спасибо за вашу помощь!

РЕДАКТИРОВАТЬ: включена трассировка

0
oliver13 14 Июн 2013 в 13:08
Включите трассировку стека и сообщите нам, где в коде возникает ошибка
 – 
Tim Hoffman
14 Июн 2013 в 13:21

1 ответ

Лучший ответ

В порядке,

У вас есть это задом наперед, вы должны декодировать данные inboud в представление Unicode.

Например

>>> x = "Ä"
>>> x.decode('utf-8')
u'\xc4'
>>> 
>>> y=x.decode('utf-8')
>>> print y
Ä
>>> 

Итак, для вашей линии

t.title = self.request.get('title').encode('utf-8')

Пытаться

t.title = self.request.get('title').decode('utf-8')

Однако это предполагает, что данные необходимо декодировать из потока utf-8.

Вы должны указать accept-charset="utf-8" в форме (или на клиенте при публикации), чтобы была определена правильная кодировка, а не угадывать и пытаться декодировать.

Например, в Windows кодировка по умолчанию не utf-8, а latin_1, и попытка декодирования utf-8 из latin_1 не сработает. Символ, который не удалось декодировать ('utf-8') (0xdc), может быть декодирован, если вы используете decode ('latin_1')

1
Tim Hoffman 14 Июн 2013 в 14:37
Откуда берутся данные, действительно ли это utf-8 или Unicode. Вы установили accept-charset = "utf-8" в форме? 0xdc кажется своим latin_1.
 – 
Tim Hoffman
14 Июн 2013 в 14:16
Часть "accept-charset" была для меня новой, но она вызывает новую ошибку: "" "UnicodeEncodeError: кодек 'ascii' не может закодировать символ u '\ xdc' в позиции 0: порядковый номер не в диапазоне (128) "" ". Может это поможет? Кстати: я использую ту же обработку и ту же форму в GAE (не в расширении Chrome), и она отлично работает.
 – 
oliver13
14 Июн 2013 в 14:19
Да ладно - работает с accept-charset, просто забыл вынуть расшифровку! Спасибо, не могли бы вы отредактировать свой ответ, чтобы я мог его принять?
 – 
oliver13
14 Июн 2013 в 14:22