Какие кодировки исходного текста программы поддерживает интерпретатор python

В python есть 2 объекта работающими с текстом: unicode и str, объект unicode хранит символы в формате (кодировке) unicode, объект str является набором байт/символов в которых python хранит остальные кодировки (utf8, cp1251, cp866, koi8-r и др).

Кодировку unicode можно считать рабочей кодировкой питона т.к. она предназначена для её использования в самом скрипте — для разных операций над строками.
Внешняя кодировка (объект str) предназначена для хранения и передачи текстовой информации вне скрипта, например для сохранения в файл или передачи по сети. Поэтому в данной статье я её назвал внешней. Самой используемой кодировкой в мире является utf8 и число приложений переходящих на эту кодировку растет каждый день, таким образом превращаясь в «стандарт». Эта кодировка хороша тем что для хранения текста она занимает оптимальное кол-во памяти и с помощью её можно закодировать почти все языки мира ( в отличие от cp1251 и подобных однобайтовых кодировок). Поэтому рекомендуется везде использовать utf8, и при написании скриптов.

Решение проблемы с кодировкой КИРИЛЛИЦЫ в VSCODE

Использование

Скрипт питона, в самом начале скрипта указываем кодировку файла и сохраняем в ней файл

# coding: utf8
# -*- coding: utf-8 -*-

для того что-бы интерпретатор python понял в какой кодировке файл

Строки в скрипте
Строки в скрипте хранятся байтами, от кавычки до кавычки:

print ‘Привет’

= 6 байт при cp1251
= 12 байт при utf8

Если перед строкой добавить символ u, то при запуске скрипта, эта байтовая строка будет декодирована в unicode из кодировки указанной в начале:

# coding:utf8 print u’Привет’

и если кодировка содержимого в файле отличается от указанной, то в строке могут быть «битые символы»

Загрузка и сохранение файла

# coding: utf8 # Загружаем файл с кодировкай utf8 text = open(‘file.txt’,’r’).read() # Декодируем из utf8 в unicode — из внешней в рабочую text = text.decode(‘utf8’) # Работаем с текстом text += text # Кодируем тест из unicode в utf8 — из рабочей во внешнюю text = text.encode(‘utf8’) # Сохраняем в файл с кодировкий utf8 open(‘file.txt’,’w’).write(text)

Текст в скрипте

# coding: utf8 a = ‘Текст в utf8′ b = u’Текст в unicode’ # Эквивалентно: b = ‘Текст в unicode’.decode(‘utf8’) # т.к. сам скрипт хранится в utf8 print ‘a =’,type(a),a # декодируем из utf-8 в unicode и далее unicode в cp866 (кодировка консоли winXP ru) print ‘a2 =’,type(a),a.decode(‘utf8’).encode(‘cp866’) print ‘b =’,type(b),b

Процедуре print текст желательно передавать в рабочей кодировке либо кодировать в кодировку ОС.
Результат скрипта при запуске из консоли windows XP:

a = type ‘str’> ╨в╨╡╨║╤Б╤В ╨▓ utf8 a2 = type ‘str’> Текст в utf8 b = type ‘unicode’> Текст в unicode

В последней строке print преобразовал unicode в cp866 автоматический, см. следующий пункт

Авто-преобразование кодировки
В некоторых случаях для упрощения разработки python делает преобразование кодировки, пример с методом print можно посмотреть в предыдущем пункте.

Лучшая IDE для Python!


В примере ниже, python сам переводит utf8 в unicode — приводит к одной кодировке для того что-бы сложить строки.

# coding: utf8 # Устанавливаем стандартную внешнюю кодировку = utf8 import sys reload(sys) sys.setdefaultencoding(‘utf8’) a = ‘Текст в utf8′ b = u’Текст в unicode’ c = a + b print ‘a =’,type(a),a print ‘b =’,type(b),b print ‘c =’,type(c),c
a = type ‘str’> Текст в utf8 b = type ‘unicode’> Текст в unicode c = type ‘unicode’> Текст в utf8Текст в unicode

Читайте также:
Программа обучения инвестициям от Тинькофф отзывы

Как видим результирующая строка «c» в unicode. Если бы кодировки строк совпадали то авто-перекодирования не произошло бы и результирующая строка содержала кодировку слагаемых строк.
Авто-перекодирование обычно срабатывает когда происходит взаимодействие разных кодировок.

Пример авто-преобразования кодировок в сравнении

# coding: utf8 # Устанавливаем стандартную внешнюю кодировку = utf8 import sys reload(sys) sys.setdefaultencoding(‘utf8’) print ‘1. utf8 and unicode’, ‘true’ if u’Слово’.encode(‘utf8′) == u’Слово’ else ‘false’ print ‘2. utf8 and cp1251’, ‘true’ if u’Слово’.encode(‘utf8′) == u’Слово’.encode(‘cp1251’) else ‘false’ print ‘3. cp1251 and unicode’, ‘true’ if u’Слово’.encode(‘cp1251′) == u’Слово’ else ‘false’
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 питон не смог.

# coding: utf8 d = [‘Тест’,’списка’] print ‘1’,d print ‘2’,d.__repr__() print ‘3’,’,’.join(d)
1 [‘xd0xa2xd0xb5xd1x81xd1x82’, ‘xd1x81xd0xbfxd0xb8xd1x81xd0xbaxd0xb0’] 2 [‘xd0xa2xd0xb5xd1x81xd1x82’, ‘xd1x81xd0xbfxd0xb8xd1x81xd0xbaxd0xb0’] 3 Тест,списка

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

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

PYTHONIOENCODING=utf8 python 1.py

статья будет дополняться.

Источник: py-my.ru

Какие кодировки исход. текста программы поддерживает интерпретатор Python?

Какие кодировки исходного текста программы поддерживает интерпретатор Python?

  • большинство кодировок, используемых сегодня
  • ASCII
  • Latin-1
  • UTF-8

комментировать
в избранное
wisge­ st [16.5K]
более года назад

C Python дела не имел и в ближайшее время не собираюсь в силу моей склонности избегать по возможности всего модного, но осмелюсь утверждать, что как почти все языки программирования Python поддерживает большинство кодировок, используемых сегодня.

Дело в том, что символы, используемые для записи лексем языка (служебных слов, знаков операций и т.п.) в большинстве современных кодировок занимают один байт (точнее, октет) и имеют одинаковый код в промежутке от 0 до 127, совпадающий с кодом в кодировке ASCII. Различия могут проявится в символах, присутствующих в записи комментариев и строковых литералов. Комментарии на выполнение программы не влияют, а предназначены для чтения человеком при ознакомления с исходным кодом программы. Многие текстовые редакторы (например, Akelpad) позволяют открывать текстовый файл в различных кодировках, поэтому с этим больших затруднений возникнуть не должно.

Строковые литералы, грубо говоря, содержат текст, выводимый программой, поэтому программа, сохранённая в кодировке отличной от поддерживаемых системой, с точки зрения интерпретатора не будет только из-за этого рассматриваться как ошибочная и будет успешно запускаться на выполнение (если в ней нет других ощибок), но текст сообщений выводимых пользователю станет не читаемым. В случае консольных приложений для Windows (не могу ничего сказать про другие ОС) это преодолевается указанием необходимой кодировки консоли. Это можно сделать в частности для текущего консольного окна с помощи команды chcp и указания кодовой страницы (например, chcp 65001 для utf-8).

Ничего не могу сказать про совместимость с интерпретатором Python кодировок, использующих для хранения всех символов, не зависимо от их кода, заведомо больше одного октета, таких как utf-16 или utf-32, но многие интерпретаторы их, по крайней мере utf-16, распознают и поддерживают. Возможно, так поступает и Python, хотя бы в случаях когда файлы с кодом программы сохранены с указывающей на их кодировку специальной метки BOM (англ. Byte Order Mark) в начале файла, или, возможно, это явным образом указано в параметрах командной строки интерпретатора.

Читайте также:
Как называется программа обработки документов на веб сайте

Источник: www.bolshoyvopros.ru

Как работать с Unicode в Python: руководство

Кодировка символов в разных языках программирования нередко вызывает сложности. И Python здесь не является исключением. В статье коснемся главных особенностей работы с символами Unicode Python , но для начала рассмотрим некоторые базовые моменты, без которых принцип работы с функциями Unicode Python вряд ли будет понятен.

Кодировки: общая информация

В общем виде кодировка предполагает перевод любого символа в понятный компьютеру вид, когда каждая буква, число или иной знак (например, ! , % , ? ) записывается в двоичном виде, как последовательность нулей и единиц. В распространенной кодировке ASCII символы группируются по так называемым контрольным точкам, представляющим собой диапазоны целочисленных значений. Эти группы охватывают специальные (контрольные) символы и те, которые не отображаются, а также числа, буквы в обоих регистрах и другие специальные знаки.

Однако проблема ASCII заключается в том, что с помощью этой кодировки можно представить только 128 символов, поскольку она поддерживает лишь 7-битные значения, а 2 7 =128. Но поскольку компьютеры оперируют преимущественно 8-битными значениями (8 бит = 1 байт или 256 возможных символов), кодировка ASCII была приведена в соответствие с этой системой. Долгое время половина значений не использовалась, и последняя 128-я кодовая (контрольная) точка записывалась так: 01111111 (это число 127 в двоичном виде, а под первым номером идет 0: 00000000).

Понятно, что этого было бы явно недостаточно для русского языка, так как кириллица в этой кодировке остается «за бортом» из-за нехватки символов. Более того, даже латинские буквы с диакритическими знаками, используемые во многих европейских языках (например, â, è, é, ş, ţ и т. д.) не могут быть представлены в ASCII. Поэтому затем возникли расширенные кодировки ASCII, использующие все 256 возможных значений.

Однако проблемой этих кодировок стало то, что они начали конфликтовать между собой, ведь в каждом расширении наборы символов были иные (разработчики отображали символы разных языков). Поэтому возникла необходимость в разработке иных кодировок, которые могли бы охватить все возможные символы на всех языках. И одной из наиболее удобных стал как раз Unicode (Юникод), появившийся в 1991 году.

При помощи Юникода можно представить более 1,11 млн. значений, чего более чем достаточно для отображения символов на языках всего мира. Здесь стоит немного остановиться на системах счисления, поскольку компьютеры не используют привычную нам десятичную, а работают преимущественно с двоичными, восьмеричными и шестнадцатеричными значениями. Это важно, поскольку, в отличие от ASCII с его восьмеричной системой счисления, Юникод использует шестнадцатеричную систему счисления, которая содержит 2 16 возможных символов.

Системы счисления и работа с ними в Python

Если мы попробуем представить, допустим, число 12 в шестнадцатеричном виде в Python, то получим следующее (введите в интерпретаторе первую строку из примера ниже и вы увидите, что Python выдаст вам 18):

>>> int(’12’, base=16)nt(’12’, base=16)
18

Добавим, что аргумент base указывает на кодировку. Почему так получилось? Дело в том, что первые 16 символов в такой кодировке — это значения от 0 до 9 плюс латинские буквы A-F. Проверить это несложно, введите, например:

Читайте также:
Miele программа прервана как включить

>>> int(‘A’, base=16)
10

A занимает 10-е место после 0-9. 16-м символом, соответственно, будет F , далее идет 11, а затем 12, то есть значение 12 занимает 18-е место в шестнадцатеричной системе счисления, потому Python и выдал нам такой результат. С помощью аргумента base мы можем запросить нужное нам число и в любой другой системе счисления. Допустим, в привычной десятичной или восьмеричной, а далее укажем и шестнадцатеричную:

>>> int(’25’, base=10)
25
>>> int(’25’, base=8)
21
>>> int(’25’, base=16)
37

Но будьте осторожны, поскольку функция int() принимает только целочисленные значения и значения ряда букв (от A до F), которые также выступают в качестве чисел в шестнадцатеричной системе. Понять такуют концепцию не сложно, просто вспомните, что в латыни все числа тоже передавались буквами: III, V, VII, X, LIV и т. д. Поэтому следующая запись вызовет ошибку, так как символу L числовое значение не присвоено ни в одной из систем:

>>> int(‘L’, base=16)
Traceback (most recent call last):
File «», line 1, in
int(‘L’, base=16)
ValueError: invalid literal for int() with base 16: ‘L’

Как видим, Python нам указал и причину ошибки: недопустимый литерал для функции int() с базовой системой счисления 16. А вот с F всё будет в порядке в шестнадцатеричной системе счисления:

>>> int(‘F’, base=16)
15

Но не во всех остальных, где эта буква не используется в качестве числового значения, например:

>>> int(‘F’, base=8)
Traceback (most recent call last):
File «», line 1, in
int(‘F’, base=8)
ValueError: invalid literal for int() with base 8: ‘F’

Кроме того, в Python существует и более удобное представление числовых значений в машинных системах счисления: двоичной, восьмеричной и шестнадцатеричной. Взгляните на следующие примеры:

>>> 10
10

>>> 0b10
2

>>> 0o10
8

>>> 0x10
16

В первом случае мы не использовали никакого префикса для числа, поэтому интерпретатор нам выдал значение числа 10 в привычной для нас десятичной системе счисления. 0b — это префикс для представления числа в двоичном виде, 0o — в восьмеричном и, наконец, 0x — в шестнадцатеричном. Таким образом, если мы хотим узнать, какое место занимает числовой символ F в шестнадцатеричной системе счисления, то нам нужно ввести в интерпретаторе следующее:

>>> 0xF
15

С остальными же префиксами (и без них) мы получим предсказуемую ошибку. Теперь мы готовы изучать Юникод.

Кодировка Unicode Python

Собственно, называть Юникод кодировкой не совсем корректно, поскольку он не извлекает биты, а только использует кодовые точки. Поэтому более правильно считать Юникод базовым набором символов. Наиболее же распространенным стандартом кодировки, использующим Unicode в качестве такого набора символов, является UTF-8, с которым вы наверняка сталкивались, если занимались конверсией текстов: например, в редакторе Notepad++. UTF-8 как раз и предназначен для конверсии символов Юникода в понятный компьютеру вид.

Давайте посмотрим на конкретных примерах, как это происходит. Для кодирования в UTF-8 будем использовать инструкцию encode() , а для декодирования — decode() (не забывайте добавлять аргумент с указанием нужной кодировки далее). Как вы сейчас убедитесь, перевод в Unicode Python особых сложностей не представляет, и вас уже не удивит, что x в начале битового символа обозначает принадлежность этого символа шестнадцатеричной системе счисления:

>>> «таймвеб».encode(«utf-8»)
b’xd1x82xd0xb0xd0xb9xd0xbcxd0xb2xd0xb5xd0xb1′
>>> b’xd1x82xd0xb0xd0xb9xd0xbcxd0xb2xd0xb5xd0xb1′.decode(«utf-8»)
‘таймвеб’

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru