Проблема кодирования ударных символов с помощью Python - PullRequest
2 голосов
/ 23 июля 2010

У меня проблемы с кодированием акцентированных символов в URL с использованием командной строки python.Сокращая мою проблему до существенного, этот код:

>>> import urllib
>>> print urllib.urlencode({'foo' : raw_input('> ')})
> áéíóúñ

печатает это в командной строке Mac:

foo=%C3%A1%C3%A9%C3%AD%C3%B3%C3%BA%C3%B1

, но тот же код печатает это в командной строке Windows:

foo=%A0%82%A1%A2%A3%A4

Результат Mac правильный и символы кодируются по мере необходимости;но в windows я получаю кучу бреда.

Я предполагаю, что проблема заключается в том, как windows кодирует символы, но я не смог найти решение;Я был бы очень признателен, если бы вы могли мне помочь.Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 23 июля 2010

Вы можете использовать явное кодирование для получения согласованного результата.

>>> str = u"áéíóúñ"
>>> import urllib
>>> urllib.urlencode({'foo':str.encode('utf-8')})
'foo=%C3%A1%C3%A9%C3%AD%C3%B3%C3%BA%C3%B1'

Однако вы должны убедиться, что ваша строка вначале в Unicode, поэтому может потребоваться декодирование, если это не так, как raw_input (). Decode ('latin1') или raw_input (). decode ('utf-8')

Входная кодировка, я полагаю, зависит от локали консоли, поэтому она зависит от системы.

EDIT: unicode(str) должен также использовать кодировку локали для преобразования в юникод, чтобы это могло быть решением.

2 голосов
/ 23 июля 2010

В командной строке Windows используется кодировка cp437 в Windows Windows. Вам нужен utf-8:

>>> import sys
>>> sys.stdin.encoding
'cp437'
>>> print urllib.urlencode({'foo':raw_input('> ').decode('cp437').encode('utf8')})
> áéíóúñ
foo=%C3%A1%C3%A9%C3%AD%C3%B3%C3%BA%C3%B1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...