Python кодировка windows 1251

Содержание
  1. Функции encode() и decode() в Python
  2. encode заданной строки
  3. Обработка ошибок
  4. Декодирование потока байтов
  5. Важность кодировки
  6. Кодировки в python
  7. Общее
  8. Использование
  9. Python-сообщество
  10. Уведомления
  11. #1 Апрель 10, 2013 14:34:57
  12. [РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
  13. #2 Апрель 10, 2013 16:12:19
  14. [РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
  15. #3 Апрель 10, 2013 16:32:20
  16. [РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
  17. #4 Апрель 10, 2013 17:10:15
  18. [РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
  19. #5 Апрель 10, 2013 17:25:47
  20. [РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
  21. #6 Апрель 10, 2013 17:36:36
  22. [РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
  23. #7 Апрель 10, 2013 17:57:19
  24. [РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
  25. #8 Апрель 10, 2013 18:11:04
  26. [РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
  27. #9 Апрель 10, 2013 18:39:16
  28. [РЕШЕНО] Python 3 POST-запрос multipart/form-data в requests с кодировкой Windows-1251
  29. Проблемы с кодировкой в Python
  30. Использование
  31. Строки в скрипте
  32. Загрузка и сохранение файла
  33. Текст в скрипте
  34. Авто-преобразование кодировки
  35. Результат
  36. Пример авто-преобразования кодировок в сравнении
  37. Результат
  38. Вывод списков
  39. Результат:
  40. Установка внешней кодировки при запуске

Функции 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. Второй правильный, поскольку форматы кодирования и декодирования совпадают.

Читайте также:  Linux сменить hostname без перезагрузки

Кодировки в 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:

Данные передает, но в форме странный текст: тест

Читайте также:  Рабочий стол для windows максимальная

Я так понимаю, 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 и др).

Читайте также:  High definition audio утилита для windows 10

Кодировку 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’]

При выводе списка, происходит вызов []() который возвращает внутреннее представление этого спиcка — print 1 и 2 являются аналогичными. Для корректного вывода списка, его нужно преобразовать в строку — print 3.

Установка внешней кодировки при запуске

В обучении ребенка важно правильное толкование окружающего его мира. Существует масса полезных журналов которые начнут экологическое воспитание дошкольников правильным путем. Развивать интерес к окружающему миру очень трудный но интересный процесс, уделите этому особое внимание.

Оцените статью