Любой текст состоит из символов. Символ — это некоторый значок, изображение. Один и тот же символ можно записать по-разному, например, два человека по-разному напишут от руки букву “A”, и даже в компьютерном представлении одна и та же буква будет выглядеть по-разному, если ее отображать разными шрифтами, при этом это будет все равно один и тот же символ. Верно и другое: разные символы могут быть записаны одинаково, например, вот две разные буквы, одна — латинского алфавита, другая - русского: “A” и “А”. Несмотря на то, что они выглядят одинаково, удобней считать их разными символами.
Итак, способ хранения текстовой информации в компьютере не связан напрямую с изображением этого текста. Вместо символов хранятся их номера - числовые коды, а вот то, как выглядит символ с данным числовым кодом на экране напрямую зависит от того, какой используется шрифт для отображения символов. При этом, разумеется, следовало бы договориться о единообразном способе кодирования символов числовыми кодами, иначе текст, записанный на одном компьютере, невозможно будет прочитать на другом компьютере.
Первоначально договорились под кодирование одного символа отвести один байт, то есть 8 бит информации. Таким образом можно было закодировать 256 различных значений, то есть в записи текста можно использовать 256 различных символов. Этого достаточно, чтобы отобразить все символы латинского алфавита, цифры, знаки препинания и некоторые другие символы. Стандарт, указывающий, какие числовые коды соответствуют каким основным символам, называется ASCII. В таблицу ASCII включены символы с кодами от 0 до 127, то есть ASCII - это семибитный код. Вот так выглядит таблица ASCII:
Char Dec Hex | Char Dec Hex | Char Dec Hex | Char Dec Hex --------------------------------------------------------------------- (nul) 0 0x00 | (sp) 32 0x20 | @ 64 0x40 | ` 96 0x60 (soh) 1 0x01 | ! 33 0x21 | A 65 0x41 | a 97 0x61 (stx) 2 0x02 | " 34 0x22 | B 66 0x42 | b 98 0x62 (etx) 3 0x03 | # 35 0x23 | C 67 0x43 | c 99 0x63 (eot) 4 0x04 | $ 36 0x24 | D 68 0x44 | d 100 0x64 (enq) 5 0x05 | % 37 0x25 | E 69 0x45 | e 101 0x65 (ack) 6 0x06 | & 38 0x26 | F 70 0x46 | f 102 0x66 (bel) 7 0x07 | ' 39 0x27 | G 71 0x47 | g 103 0x67 (bs) 8 0x08 | ( 40 0x28 | H 72 0x48 | h 104 0x68 (ht) 9 0x09 | ) 41 0x29 | I 73 0x49 | i 105 0x69 (nl) 10 0x0a | * 42 0x2a | J 74 0x4a | j 106 0x6a (vt) 11 0x0b | + 43 0x2b | K 75 0x4b | k 107 0x6b (np) 12 0x0c | , 44 0x2c | L 76 0x4c | l 108 0x6c (cr) 13 0x0d | - 45 0x2d | M 77 0x4d | m 109 0x6d (so) 14 0x0e | . 46 0x2e | N 78 0x4e | n 110 0x6e (si) 15 0x0f | / 47 0x2f | O 79 0x4f | o 111 0x6f (dle) 16 0x10 | 0 48 0x30 | P 80 0x50 | p 112 0x70 (dc1) 17 0x11 | 1 49 0x31 | Q 81 0x51 | q 113 0x71 (dc2) 18 0x12 | 2 50 0x32 | R 82 0x52 | r 114 0x72 (dc3) 19 0x13 | 3 51 0x33 | S 83 0x53 | s 115 0x73 (dc4) 20 0x14 | 4 52 0x34 | T 84 0x54 | t 116 0x74 (nak) 21 0x15 | 5 53 0x35 | U 85 0x55 | u 117 0x75 (syn) 22 0x16 | 6 54 0x36 | V 86 0x56 | v 118 0x76 (etb) 23 0x17 | 7 55 0x37 | W 87 0x57 | w 119 0x77 (can) 24 0x18 | 8 56 0x38 | X 88 0x58 | x 120 0x78 (em) 25 0x19 | 9 57 0x39 | Y 89 0x59 | y 121 0x79 (sub) 26 0x1a | : 58 0x3a | Z 90 0x5a | z 122 0x7a (esc) 27 0x1b | ; 59 0x3b | [ 91 0x5b | { 123 0x7b (fs) 28 0x1c | < 60 0x3c | \ 92 0x5c | | 124 0x7c (gs) 29 0x1d | = 61 0x3d | ] 93 0x5d | } 125 0x7d (rs) 30 0x1e | > 62 0x3e | ^ 94 0x5e | ~ 126 0x7e (us) 31 0x1f | ? 63 0x3f | _ 95 0x5f | (del) 127 0x7f
При этом символы с кодами, меньшими 32 - это специальные управляющие символы, которые не отображаются на экране. Например, для того, чтобы обозначить конец строки в системе Linux используется один символ с кодом 10, а в системе Windows - два подряд идущих символа с кодами 13 и 10, символы с кодами 48-57 соответствуют начертанию арабских цифр (обратите внимание, символ с кодом 0 - это вовсе не символ, отображающийся на экране, как “0”), символы с кодами 65-90 - заглавные буквы буквы латинского алфавита, а если к их кодам прибавить 32, то получатся строчные буквы латинского алфавита. В промежутках между указанными диапазонами находятся знаки препинания, математические операции и прочие символы.
Но в ASCII-таблице нет русских букв! А также нет букв сотен других национальных алфавитов. Первоначально для отображения букв национальных алфавитов использовали вторую половину возможного значения байта, то есть символы с кодами от 128 до 255. Это приводило к множеству проблем, например, поскольку 128 значений явно недостаточно для того, чтобы отобразить символы всех национальных алфавитов (даже недостаточно для того, чтобы отобразить символы одного алфавита, например, китайской письменности. Поэтому в настоящее время для кодирования символов используется стандарт Unicode, последняя версия 6.0 которого (октябрь, 2010) включает свыше 109000 различных символов. Естественно, для кодирования Unicode-символов недостаточно одного байта на символ, поэтому используются многобайтовые кодировки (для представления одного символа необходимо несколько байт).
Язык программирования Python — современный язык, поэтому он работает исключительно с Unicode-символами.
Код символа можно определить при помощи функции ord
. Эта функция
получает на вход строку, которая должна состоять ровно из одного символа.
Функция возвращает код этого символа. Например, ord('A')
вернет
число 65.
Обратная функция получения по числовому коду его номера называется
chr
.
Поскольку для символов заданы их числовые коды, то их можно сравнивать при помощи операций сравения. Поскольку символы алфавита идут подряд, то результат их сравнения будет соответствовать лексикографическому порядку, но можно сравнивать между собой не только буквы алфавита, но и два произвольных символа.
Также в питоне определены и операции сравнения строк, которые также сравниваются в лексикографическом порядке.
Строки в языке Питон, в отличии от списков, являются неизменными объектами, то есть
в отличии от списков нельзя изменить отдельный символ строки: операция A[i] = ...
является допустимой, если A
список, и недопустимой, если A — строка.
Один символ в строке можно поменять, если создать новую строку, например, следующий код меняет
i
-й символ строки на символ @
.
A = A[:i] + '@' + A[i + 1:]
К сожалению, подобное изменение требует время, пропорциональное длине строки.
Преобразование строки S
в список символов A
:
A = list(S)
Преобразование списка символов в строку:
S = ''.join(A)