Строки и символы

Коды символов

Любой текст состоит из символов. Символ — это некоторый значок, изображение. Один и тот же символ можно записать по-разному, например, два человека по-разному напишут от руки букву “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)