- Функции encode() и decode() в Python
- encode заданной строки
- Обработка ошибок
- Декодирование потока байтов
- Важность кодировки
- Кодировки в python
- Общее
- Использование
- Python-сообщество
- Уведомления
- #1 Апрель 10, 2013 14:34:57
- [РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
- #2 Апрель 10, 2013 16:12:19
- [РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
- #3 Апрель 10, 2013 16:32:20
- [РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
- #4 Апрель 10, 2013 17:10:15
- [РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
- #5 Апрель 10, 2013 17:25:47
- [РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
- #6 Апрель 10, 2013 17:36:36
- [РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
- #7 Апрель 10, 2013 17:57:19
- [РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
- #8 Апрель 10, 2013 18:11:04
- [РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
- #9 Апрель 10, 2013 18:39:16
- [РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
- Проблемы с кодировкой в Python
- Использование
- Строки в скрипте
- Загрузка и сохранение файла
- Текст в скрипте
- Авто-преобразование кодировки
- Результат
- Пример авто-преобразования кодировок в сравнении
- Результат
- Вывод списков
- Результат:
- Установка внешней кодировки при запуске
Функции encode() и decode() в Python
Методы encode и decode Python используются для кодирования и декодирования входной строки с использованием заданной кодировки. Давайте подробно рассмотрим эти две функции.
encode заданной строки
Мы используем метод encode() для входной строки, который есть у каждого строкового объекта.
Это кодирует input_string с использованием encoding , где errors определяют поведение, которому надо следовать, если по какой-либо случайности кодирование строки не выполняется.
encode() приведет к последовательности bytes .
Как и ожидалось, в результате получается объект :
Тип кодирования, которому надо следовать, отображается параметром encoding . Существуют различные типы схем кодирования символов, из которых в Python по умолчанию используется схема UTF-8.
Рассмотрим параметр encoding на примере.
Как вы можете заметить, мы закодировали входную строку в формате UTF-8. Хотя особой разницы нет, вы можете заметить, что строка имеет префикс b . Это означает, что строка преобразуется в поток байтов.
На самом деле это представляется только как исходная строка для удобства чтения с префиксом b , чтобы обозначить, что это не строка, а последовательность байтов.
Обработка ошибок
Существуют различные типы errors , некоторые из которых указаны ниже:
Тип ошибки | Поведение |
strict | Поведение по умолчанию, которое вызывает UnicodeDecodeError при сбое. |
ignore | Игнорирует некодируемый Unicode из результата. |
replace | Заменяет все некодируемые символы Юникода вопросительным знаком (?) |
backslashreplace | Вставляет escape-последовательность обратной косой черты (\ uNNNN) вместо некодируемых символов Юникода. |
Давайте посмотрим на приведенные выше концепции на простом примере. Мы рассмотрим входную строку, в которой не все символы кодируются (например, ö ),
Декодирование потока байтов
Подобно кодированию строки, мы можем декодировать поток байтов в строковый объект, используя функцию decode() .
Поскольку encode() преобразует строку в байты, decode() просто делает обратное.
Это показывает, что decode() преобразует байты в строку Python.
Подобно параметрам encode() , параметр decoding определяет тип кодирования, из которого декодируется последовательность байтов. Параметр errors обозначает поведение в случае сбоя декодирования, который имеет те же значения, что и у encode() .
Важность кодировки
Поскольку кодирование и декодирование входной строки зависит от формата, мы должны быть осторожны при этих операциях. Если мы используем неправильный формат, это приведет к неправильному выводу и может вызвать ошибки.
Первое декодирование неверно, так как оно пытается декодировать входную строку, которая закодирована в формате UTF-8. Второй правильный, поскольку форматы кодирования и декодирования совпадают.
Кодировки в python
прочтение статьи занимает 4мин, с обдумыванием — 10мин 🙂
примечание: данная статья относится к python 2.x, но для python 3.x принцип тот же
Общее
В python есть 2 объекта работающими с текстом: unicode и str, объект unicode хранит символы в формате (кодировке) unicode, объект str является набором байт/символов в которых python хранит остальные кодировки (utf8, cp1251, cp866, koi8-r и др).
Кодировку unicode можно считать рабочей кодировкой питона т.к. она предназначена для её использования в самом скрипте — для разных операций над строками.
Внешняя кодировка (объект str) предназначена для хранения и передачи текстовой информации вне скрипта, например для сохранения в файл или передачи по сети. Поэтому в данной статье я её назвал внешней. Самой используемой кодировкой в мире является utf8 и число приложений переходящих на эту кодировку растет каждый день, таким образом превращаясь в «стандарт». Эта кодировка хороша тем что для хранения текста она занимает оптимальное кол-во памяти и с помощью её можно закодировать почти все языки мира ( в отличие от cp1251 и подобных однобайтовых кодировок). Поэтому рекомендуется везде использовать utf8, и при написании скриптов.
Использование
для того что-бы интерпретатор python понял в какой кодировке файл
Строки в скрипте
Строки в скрипте хранятся байтами, от кавычки до кавычки:
= 6 байт при cp1251
= 12 байт при utf8
Если перед строкой добавить символ u, то при запуске скрипта, эта байтовая строка будет декодирована в unicode из кодировки указанной в начале:
и если кодировка содержимого в файле отличается от указанной, то в строке могут быть «битые символы»
Загрузка и сохранение файла
В последней строке print преобразовал unicode в cp866 автоматический, см. следующий пункт
Авто-преобразование кодировки
В некоторых случаях для упрощения разработки python делает преобразование кодировки, пример с методом print можно посмотреть в предыдущем пункте.
В примере ниже, python сам переводит utf8 в unicode — приводит к одной кодировке для того что-бы сложить строки.
Как видим результирующая строка «c» в unicode. Если бы кодировки строк совпадали то авто-перекодирования не произошло бы и результирующая строка содержала кодировку слагаемых строк.
Авто-перекодирование обычно срабатывает когда происходит взаимодействие разных кодировок.
Пример авто-преобразования кодировок в сравнении
В сравнении 1, кодировка utf8 преобразовалась в unicode и сравнение произошло корректно.
В сравнении 2, сравниваются кодировки одного вида — обе внешние, т.к. кодированы они в разных кодировках условие выдало что они не равны.
В сравнении 3, выпало предупреждение из за того что выполняется сравнение кодировок разного вида — рабочая и внешняя, а авто-декодирование не произошло т.к. стандартная внешняя кодировка = utf8, и декодировать строку в кодировке cp1251 методом utf8 питон не смог.
При выводе списка, происходит вызов [<repr>]() который возвращает внутреннее представление этого спиcка — print 1 и 2 являются аналогичными. Для корректного вывода списка, его нужно преобразовать в строку — print 3.
Установка внешней кодировки при запуске
статья будет дополняться.
Python-сообщество
Уведомления
#1 Апрель 10, 2013 14:34:57
[РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
Доброго времени суток уважаемые форумчане.
Пробую тут передать данные на страницу с формами(multipart/form-data) на сайт. Столкнулся с проблемой кодировок. Итак суть:
1. сайт в кодировке Windows-1251
2. файл, в котором идут поля которые нужно передать в кодировке Windows-1251
3. Пример скрипта, тоже в cp1251, запускается на FreeBSD:
Данные передает, но в форме странный текст: тест
Я так понимаю, POST по стандарту передает в utf-8, вот почему такой результат. Как заставить передавать его в Windows-1251 ?
Буду благодарен за любой совет или пинок в правильную сторону
———
П.С. кому интересно решение и нет охоты читать все ответы, то тут все просто, возможности передать cp1251 через multipart/form-data в Python 3/requests пока нет. Только UTF-8. Так что передавайте data=postdata через form-urlencoded
Отредактировано omatic (Апрель 11, 2013 22:15:22)
#2 Апрель 10, 2013 16:12:19
[РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
Я уже говорил когда-то. Тех, кто использует восьмибитные кодировки, надо сжигать на кострах.
#3 Апрель 10, 2013 16:32:20
[РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
ZZZ, я тоже за использование юникода и utf-8, но на сайте кодировка Windows-1251, и этого я изменить не могу, вот и пробую выкрутиться, что бы хоть как-то туда автоматический постинг прикрутить.
#4 Апрель 10, 2013 17:10:15
[РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
На самом деле в s_cp1251 находится Юникод, а requests его заботливо перекодирует в utf-8 при отправке.
Чтобы отправить текст в своей кодировке, нужно передавать байтовые объекты:
#5 Апрель 10, 2013 17:25:47
[РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
reclosedev, Спасибо, другой вопрос, передаем мы теперь в бинарном режиме, соответственно в форме на сайте я теперь получаю:
Отредактировано omatic (Апрель 10, 2013 17:25:56)
#6 Апрель 10, 2013 17:36:36
[РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
А вопрос в чем? Как это в текст переделать?
#7 Апрель 10, 2013 17:57:19
[РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
Вопрос в передаче строки через requests в правильной кодировке. Вот пример:
сделал и передал:
соответственно оно и передало мне в бинарном режиме, и на сайте куда передавал в форме получения текст: b’\xf2\xe5\xf1\xf2′
Если я передаю, переделав в текст:
то получаю в форме: тест как и в первом варианте, когда передавал просто текст без кодирование.
Но нужно что бы в форме на сайте получился текст “тест”
Отредактировано omatic (Апрель 10, 2013 17:57:28)
#8 Апрель 10, 2013 18:11:04
[РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
Где это смотрится? Полагаю, что получено в ответе с сайта. Так вот перекодируйте это и будет ‘тест’.
#9 Апрель 10, 2013 18:39:16
[РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
reclosedev, на сайте, может я плохо обьяснил, смотрите:
Суть в том , что есть форум, в компании(хостера), мне нужно текст со своего ПК туда постить в ветку форума/новости. Форум у них на IPB старой версии, который на кодировке Windows-1251. Соответственно я делаю логин скриптом и передаю в форму создания поста, слово “тест” POST запросом, вот что я передаю то и появляется в созданной теме на форуме.
тоесть: передаю с Питона слово тест а получаю на форуме тест , соответственно я немогу там его кодировать/декодировать , передавая бинарным способом и т.п.
Вот тут то я и запутался, я неправильно передаю или просто форма форума не правильно воспринимает то что я передаю?
Отредактировано omatic (Апрель 10, 2013 18:42:27)
Проблемы с кодировкой в Python
В python есть 2 объекта работающими с текстом: unicode и str, объект unicode хранит символы в формате (кодировке) unicode, объект str является набором байт/символов в которых python хранит остальные кодировки (utf8, cp1251, cp866, koi8-r и др).
Кодировку unicode можно считать рабочей кодировкой питона т.к. она предназначена для её использования в самом скрипте — для разных операций над строками.
Внешняя кодировка (объект str) предназначена для хранения и передачи текстовой информации вне скрипта, например для сохранения в файл или передачи по сети. Поэтому в данной статье я её назвал внешней. Самой используемой кодировкой в мире является utf8 и число приложений переходящих на эту кодировку растет каждый день, таким образом превращаясь в «стандарт».
Эта кодировка хороша тем что для хранения текста она занимает оптимальное кол-во памяти и с помощью её можно закодировать почти все языки мира ( в отличие от cp1251 и подобных однобайтовых кодировок). Поэтому рекомендуется везде использовать utf8, и при написании скриптов.
Использование
Скрипт питона, в самом начале скрипта указываем кодировку файла и сохраняем в ней файл
для того что-бы интерпретатор python понял в какой кодировке файл
Строки в скрипте
Строки в скрипте хранятся байтами, от кавычки до кавычки:
= 6 байт при cp1251
= 12 байт при utf8
Если перед строкой добавить символ u, то при запуске скрипта, эта байтовая строка будет декодирована в unicode из кодировки указанной в начале :
и если кодировка содержимого в файле отличается от указанной, то в строке могут быть «битые символы»
Загрузка и сохранение файла
Текст в скрипте
Процедуре print текст желательно передавать в рабочей кодировке либо кодировать в кодировку ОС.
Результат скрипта при запуске из консоли windows XP:
a2 = Текст в utf8
b = Текст в unicode
В последней строке print преобразовал unicode в cp866 автоматический, см. следующий пункт
Авто-преобразование кодировки
В некоторых случаях для упрощения разработки python делает преобразование кодировки, пример с методом print можно посмотреть в предыдущем пункте.
В примере ниже, python сам переводит utf8 в unicode — приводит к одной кодировке для того что-бы сложить строки.
Результат
a = Текст в utf8
b = Текст в unicode
c = Текст в utf8Текст в unicode
Как видим результирующая строка «c» в unicode. Если бы кодировки строк совпадали то авто-перекодирования не произошло бы и результирующая строка содержала кодировку слагаемых строк.
Авто-перекодирование обычно срабатывает когда происходит взаимодействие разных кодировок.
Пример авто-преобразования кодировок в сравнении
Результат
1. utf8 and unicode true
2. utf8 and cp1251 false
script.py:10: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode — interpreting them as being unequal
print ‘3. cp1251 and unicode’, ‘true’ if u’Слово’.encode(‘cp1251′) == u’Слово’ else ‘false’
3. cp1251 and unicode false
В сравнении 1, кодировка utf8 преобразовалась в unicode и сравнение произошло корректно.
В сравнении 2, сравниваются кодировки одного вида — обе внешние, т.к. кодированы они в разных кодировках условие выдало что они не равны.
В сравнении 3, выпало предупреждение из за того что выполняется сравнение кодировок разного вида — рабочая и внешняя, а авто-декодирование не произошло т.к. стандартная внешняя кодировка = utf8, и декодировать строку в кодировке cp1251 методом utf8 питон не смог.
Вывод списков
Результат:
1 [‘\xd0\xa2\xd0\xb5\xd1\x81\xd1\x82’, ‘\xd1\x81\xd0\xbf\xd0\xb8\xd1\x81\xd0\xba\xd0\xb0’]
2 [‘\xd0\xa2\xd0\xb5\xd1\x81\xd1\x82’, ‘\xd1\x81\xd0\xbf\xd0\xb8\xd1\x81\xd0\xba\xd0\xb0’]
При выводе списка, происходит вызов [
Установка внешней кодировки при запуске
В обучении ребенка важно правильное толкование окружающего его мира. Существует масса полезных журналов которые начнут экологическое воспитание дошкольников правильным путем. Развивать интерес к окружающему миру очень трудный но интересный процесс, уделите этому особое внимание.