Саммерфилд - Программирование на Python 3 (1077331), страница 24
Текст из файла (страница 24)
Первый вызов в(г, (агаа!() выводит текст «паше», отцентрированный в поле вывода, шириной 40 символов, а второй вызов выводит пустую строку в поле шириной 40 символов, используя символ «-» в качестве символа-заполнителя, с выравниванием по левому краю. (Мы вынуждены указывать символ выравнивания, когда задается символ-заполнитель.) Как вариант, вторую строку функции можно было записать, как показано ниже: (О)".Гогаа(("-" ° 40)) рг!п!("- Глава 2. Типы данных Здесь мы использовали оператор дублирования строки (*), чтобы создать необходимую строку, и просто вставили ее в строку формата. В третьем случае можно было бы просто ввести 40 символов «-» и использовать простой литерал строки.
а Текущий код символа Юникода сохраняется в перемен- Кодировки символов ной соее, котоРаЯ иниЦиализиРУетсЯ коДом пРобела сгр. 02 (Ох20). В переменную епо записывается максимально возможный код символа Юникода, который может принимать разные значения в зависимости от того, какая из кодировок (()СЯ-2 или ()СЯ-4) использовалась при компиляции Рус)воп. Внутри цикла нл11е с помощью функции олг() мы получаем символ Юникода, соответствующий числовому коду. Функция оп1сооеоата, паза() возвращает название заданного символа Юникода, во втором необязательном аргументе передается имя. которое будет использовано в случае, когда имя символа не определено. Если пользователь не указывает аргумент командной строки (иогп .а Коле) или аргумент был указан и он входит в состав копии имени символа Юникода, в которой все символы приведены к нижнему регистру, то выводится соответствующая строка таблицы.
Мы передаем переменную соее методу агг. Тогваг() один раз, но в строке формата она используется трижды. Первый раз — при выводе значения созе как целого числа в поле с шириной 7 символов (по умолчанию в качестве символа-заполнителя используется пробел, поэтому нет необходимости явно указывать его). Второй раз — при выводе значения соее как целого числа в шестнадцатеричном формате символами верхнего регистра в поле шириной 5 символов. И третий раз — при выводе символа Юникода„соответствующего значению созе, с помощью спецификатора формата «с», отцентрированного в поле с минимальной шириной 3 символа.
Обратите внимание, что нам не потребовалось указывать тип «Й» в первом спецификаторе формата, потому что он подразумевается по умолчанию для целых чисел. Второй аргумент— это имя символа Юникода, которое выводится с помощью метода эгг, 1111е(), в результате которого первый символ каждого слова преобразуется к верхнему регистру, а остальные символы — к нижнему. Теперь, когда мы познакомились с универсальным методом асг.
Тогаа( ), мы можем с успехом использовать его на протяжении остальной части книги. Кодировки символов Так или иначе, но компьютеры могут хранить информацию только в виде байтов, то есть в виде 8-битовых значений в диапазоне от Ох00 до Охрр. Каждый символ должен быть представлен некоторым образом в терминах байтов. На заре развития вычислительной техники были Строки разработаны схемы кодирования символов, в которых каждому конкретному был поставлен в соответствие байт с конкретным значением. Например, в кодировке АЯСП символ А представлен байтом со значением Ох41,  — Ох42 и т. д. В Западной Европе часто использовалась кодировка 1 ат(п-1, ее первые 127 символов совпадали с 7-битовой кодировкой АЯСП, а остальные значения представляли символы с умляутами и другие символы, необходимые европейцам.
За долгие годы появилось множество кодировок, которые используются до сих пор. К сожалению, наличие такого разнообразия кодировок оказалось очень неудобным, особенно при разработке интернационализируемого программного обеспечения. Одним из решений, которое было принято практически повсеместно, стало применение кодировки Юникод. В кодировке Юникод каждому символу ставится в соответствие целое число, то есть его код, как и в кодировках, разработанных ранее, но Юникод не ограничивается использованием одного байта на символ и потому способен обеспечить единую систему представления каждого символа любого языка. А для обеспечения обратной совместимости первые 127 символов Юникода совпадают со 127 символами 7-битовой кодировки АЗСП.
Но как хранятся символы Юникода2 В настоящее время определено немногим более 1 миллиона символов Юникода, поэтому даже 32-битовых целых чисел со знаком более чем достаточно для представления любого кода в кодировке Юникод. Таким образом, самый простой способ хранения символов Юникода заключается в использовании последовательностей 32-битовых целых чисел, по одному целому числу на символ. Такое представление очень удобно хранить в памяти, потому что мы получаем массив 32-битовых чисел, элементы которого имеют однозначное соответствие с символами.
Но тогда если текст в файлах или передаваемый по сети в основном содержит символы 7-битовой кодировки АЯСП, то три из четырех переданных байтов будут нулевыми (Ох00). Чтобы избежать появления такого большого объема ненужной информации, сама кодировка Юникод имеет несколько представлений. В памяти символы Юникода хранятся либо в формате ()СЯ-2 (по сути, 16-битовые целые беззнаковые числа), способном представить первые 65 535 кодов символов, или в формате УСЯ-4 (32-битовые целые числа), способном представить все коды символов, которых к моменту написания этих строк было 1 114 111.
Выбор того или иного формата производится на этапе компиляции РуП122 (Ьоп. (Если значение эуэ, эахоотсосе равно 65 535, значит Ру$)топ компилировался с поддержкой формата ()СЯ-2). При сохранении данных в виде файлов или при передаче по сети используется более сложный формат представления. При использовании Юникода коды символов могут кодироваться с помощью кодировки ()ТР-З, в которой первые 127 символов кодируются однобайтовыми Глава 2.
Типы данных значениями, а остальные — двумя или более байтами. Кодировка ПТР-8 очень компактна для английского текста, и если в нем используются только символы из 7-битового набора АЯСП, то файлы с текстом в кодировке ()ТР-8 ничем не отличаются от файлов в кодировке АЯСП.
Другая популярная кодировка — ПТ» -16. В ней для кодирования значительной части символов используются два байта и для остальных— четыре байта. Она более компактна для некоторых азиатских языков, чем ПТР-8, но, в отличие от нее, текст в кодировке ()ТГ-16 должен начинаться с признака, указывающего порядок следования байтов, чтобы при чтении кодов можно было определить, какой порядок следования пар байтов используется — прямой (Ы3-еп61ап) или обратный (!!ЬЬ- !е-епг(!ап).
Кроме того, по-прежнему широко используются старые кодировки, такие как СВ2312, 130-8859-6, 1 а(!п-1. Метод вгг. епсоце() возвращает последовательность байтов, фактически — объект типа Ьугев, о котором будет рассказываться в главе 7, закодированных в соответствии с кодировкой, заданной в качестве аргумента. С помощью этого метода можно глубже понять различия между кодировками и понять, почему неправильные предположения о кодировке могут приводить к появлению ошибок: »> агг>в1 = "Таце 1веп" »> агг>вг.епсоое("ьастп1") Ь'Таде (хс5в(хе9п' »> аг11в1. епсоое( '09850' ) Ь'Таде ХхбпвХхбцп' »> аггтв1.епсоое("о!18") Ь'Таце ххсбх,х85в>,хсбх,хада' »> агг>в1.епсоое("ос»18") Ь''ххГГхх»еТ'~хООа>,х009'ххООе>,хОО >,х001хс5>,хООвхх00>,хец'ххООп'хх00' Символ «Ь» перед открывающей кавычкой указывает, что это не строковый литерал, а литерал типа Ьугев.
Для удобства при создании литералов типа Ьугев мы можем смешивать печатаемые символы АЯСП с экранированными шестнадцатеричными значениями. Мы не можем представить имя «Та3е х««веп» с помощью символов АЯСП, потому что в этом наборе отсутствует символ «А», как и любые другие символы с умляутами, поэтому при попытке сделать это возбуждается исключение 001сооеЕпсобеЕггог. Кодировка Ва(!и-1 (известная так же, как 130-8859-1) использует для представления символов 8-битовые значения, и в ней присутствуют все символы, необходимые для представления данного имени.
С другой стороны, артисту Егпб Вап)с повезло меньше, так как символ «б» отсутствует в наборе символов Ва(!и-1. Конечно, оба имени благополучно могут быть представлены в кодировке Юникод. Примечательно, что при использовании кодировки ПТР-16 первые два байта являются признаком порядка следования байтов — они используются функцией декодирования, чтобы определить, какой порядок следования используется, прямой или обратный, и выполнить декодирование соответствующим образом. 115 Строки Следует отметить пару важных особенностей, присущих методу эт г. епсоое(). Первый аргумент (имя кодировки) не чувствителен к регистру символов, а символы дефиса и подчеркивания в имени считаются эквивалентными, поэтому имена «пв-авсй» и «(ТЯ АЯСП» рассматриваются как одно и то же имя.