2009-07-03 2 views
1

У меня возникли проблемы с попыткой конвертировать строку UTF-8 в unicode. Я получаю ошибку.Python Unicode UnicodeEncodeError

UnicodeEncodeError: 'ascii' codec can't encode characters in position 73-75: ordinal not in range(128) 

Я попробовал оборачивать это в блоке try/except но Google дает мне ошибку системного администратора, которая была одна строка. Может кто-нибудь предложить, как поймать эту ошибку и продолжить.

Cheers, John.

- ПОЛНЫЙ ERROR -

Traceback (most recent call last): 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/webapp/__init__.py", line 501, in __call__ 
    handler.get(*groups) 
    File "/Users/johnb/Sites/hurl/hurl.py", line 153, in get 
    self.redirect(url.long_url) 
    File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/webapp/__init__.py", line 371, in redirect 
    self.response.headers['Location'] = str(absolute_url) 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 73-75: ordinal not in range(128) 

ответ

8

Правильный solution должен сделать следующее:

self.response.headers['Location'] = urllib.quote(absolute_url.encode("utf-8")) 
+0

self.redirect (absolute_url.encode ('utf-8')) –

+0

Вышеупомянутый комментарий - правильный код. Извиняюсь за неправильное задание вопроса правильно, я не на 100% точно, какие у меня есть данные и, следовательно, полный код ошибки. Спасибо, что помогли Алексу. Это должно исправить ошибку URL-адреса для www.hurl.ws –

+0

@ Джон, ну, если вы хотите перенаправить, тогда вы хотите перенаправить, я просто показывал, как правильно кодировать и цитировать общий URL-адрес Юникода ;-). Как любопытство, почему вы приняли это (спасибо!), Но не повысили его? Это характерно для SO etiquette ...! -) –

-1

Попробуйте это:

self.response.headers['Location'] = absolute_url.decode("utf-8") 
or 
self.response.headers['Location'] = unicode(absolute_url, "utf-8") 
+0

К сожалению, что не работал. Это мой текущий код. Поскольку я вызываю self.redirect, строка получает кодировку и вызывает ошибку, потому что в этом случае у URL-адреса фактически есть «å». Если эта ошибка возникает, я пишу URL-адрес на странице и используя тег META-REFRESH, я заставляю браузер делать перенаправление через несколько секунд self.redirect (url.long_url) –

+0

@zdmytriv: unicode (absolute_url)? Разве UTF-8 не упоминается где-то? –

+0

Исправлено должно работать сейчас – zinovii

1

Исправьте этот беспорядок, так что это разборчивыми. Подсказка: используйте «блок кода» (101010 штук).

Вы говорите, что вы пытаетесь преобразовать строку UTF-8 в unicode, но str(absolute_url) - это странный способ обойти это. Вы уверены, что absolute_url UTF-8? Попробуйте

print type(absolute_url) 
print repr(absolute_url) 

Если является UTF-8, вам нужно absolute_url.decode('utf8')

4

Заголовок местоположение вы пытаетесь установить потребности быть Url, и Url должен быть в Ascii. Поскольку ваш Url не является строкой Ascii, вы получаете ошибку. Просто поймать ошибку не поможет, поскольку заголовок Location не будет работать с недопустимым URL.

При создании absolute_url вам необходимо убедиться, что он закодирован правильно, лучше всего используя urllib.quote и строки encode(). Вы можете попробовать это:

self.response.headers['Location'] = urllib.quote(absolute_url.encode('utf-8'))