Перейти на главную страничку сайта (список статей, файлы для скачивания)

ФОРУМ (здесь можно обсудить эту статью, а также любые проблемы программирования на различных макроязыках и в скриптовых средах)

Кодировки и наборы символов

Набор символов или кодировка (character set, charset) - это определённая таблица кодирования конечного множества символов.

Кодовая страница (code page) - это однобайтная (8-битная) кодировка.

Кодировка ASCII (American Standard Code for Information Interchange - "аски", с ударением на первом слоге) - это 7-битная (128 символов) кодировка для представления латинского алфавита, десятичных цифр, некоторых знаков препинания, арифметических операций и управляющих символов.

В 8-битных национальных кодировках нижнюю половину кодовой таблицы (0 - 127) занимают символы ASCII, а верхнюю (128 - 255) - другие нужные символы. В Юникоде первые 128 символов тоже совпадают с соответствующими символами ASCII.

Символы ASCII (в шестнадцатеричном представлении):


0123 4567 89AB CDEF
0NULSOHSTXETXEOTENQ ACKBELBSHTLFVTFFCRSOSI
1DLEDC1DC2DC3DC4NAK SYNETBCANEMSUBESCFSGSRSUS
2SP!"#$% &'()*+,-./
3012345 6789:;<=>?
4@ABCDE FGHIJKLMNO
5PQRSTU VWXYZ[\]^_
6`abcde fghijklmno
7pqrstu vwxyz{|}~DEL

Управляющие символы и их шестнадцатеричные коды:


NUL00 NULL, пусто. Используется во многих языках программирования как конец строки (строка понимается как последовательность символов). В некоторых операционных системах NUL - последний символ любого текстового файла.
SOH01 Start Of Heading, начало заголовка.
STX02 Start of Text, начало текста. Текстом называлась часть сообщения телетайпа, предназначенная для печати.
ETX03 End of Text, конец текста. Здесь телетайп прекращал печатать. Отсюда происходит использование символа Ctrl-C, имеющего код 03, для прекращения работы чего-то (обычно программы).
EOT04 End of Transmission, конец передачи. В системе UNIX Ctrl-D, имеющий тот же код, означает конец файла при вводе с клавиатуры.
ENQ05 Enquire, "прошу подтверждения".
ACK06 Acknowledgement, "подтверждаю".
BEL07 Bell, звонок. Часто используется для подачи звукового сигнала.
BS08 Backspace, возврат на один символ.
TAB09 Табуляция. Обозначается также HT - Horizontal Tabulation, горизонтальная табуляция. Во многих языках программирования обозначается \t.
LF0A Line Feed, перевод строки. Сейчас в конце каждой строчки текстового файла ставится либо этот символ, либо CR, либо и тот и другой (CR, затем LF), в зависимости от операционной системы. Во многих языках программирования этот символ обозначается \n и при выводе текста приводит к переводу строки.
VT0B Vertical Tab, вертикальная табуляция.
FF0C Form Feed, новая страница.
CR0D Carriage Return, возврат каретки. Во многих языках программирования этот символ, обозначаемый \r, можно использовать для возврата в начало строчки без перевода строки. В некоторых операционных системах этот же символ, обозначаемый Ctrl-M, ставится в конце каждой строчки текстового файла перед LF.
SO0E Shift Out, начало использования национальной кодировки.
SI0F Shift In, обратно к Shift Out.
DLE10 Data Link Escape, следующие символы имеют специальный смысл.
DC111 Device Control 1, 1-й символ управления устройством - включить устройство чтения перфоленты.
DC212 Device Control 2, 2-й символ управления устройством - включить перфоратор.
DC313 Device Control 3, 3-й символ управления устройством - выключить устройство чтения перфоленты.
DC414 Device Control 4, 4-й символ управления устройством — выключить перфоратор.
NAK15 Negative Acknowledgment, "не подтверждаю". Обратно к Acknowledgment.
SYN16 Synchronization. Этот символ передавался, когда для синхронизации было необходимо что-нибудь передать.
ETB17 End of Text Block, конец текстового блока.
CAN18 Cancel, отмена (того, что было передано ранее).
EM19 End of Medium, например, "кончилась перфолента"
SUB1A Substitute, подставить. Следующий символ — другого цвета или из дополнительного набора символов.
ESC1B Escape. Следующие символы — что-то специальное.
FS1C File Separator, разделитель файлов.
GS1D Group Separator, разделитель групп.
RS1E Record Separator, разделитель записей.
US1F Unit Separator, разделитель юнитов. Когда-то поддерживалось 4 уровня структуризации данных: сообщение могло состоять из файлов, файлы из групп, группы из записей, записи из юнитов.
SP20 Space, пробел.
DEL7F Delete, стереть (последний символ).

Кодировка Windows-1251 (cp1251) является стандартной 8-битной кодировкой для всех русских версий Microsoft Windows. Первая часть таблицы кодировки (латиница) полностью соответствует кодировке ASCII. Вторая часть (под символами указаны шестнадцатеричные коды Unicode):


0123 4567 89AB CDEF
8Ђ
0402
Ѓ
0403

201A
ѓ
0453

201E

2026

2020

2021

20AC

2030
Љ
0409

2039
Њ
040A
Ќ
040C
Ћ
040B
Џ
040F
9ђ
0452

2018

2019

201C

201D

2022

2013

2014

2122
љ
0459

203A
њ
045A
ќ
045C
ћ
045B
џ
045F
A 
00A0
Ў
040E
ў
045E
Ј
0408
¤
00A4
Ґ
0490
¦
00A6
§
00A7
Ё
0401
©
00A9
Є
0404
«
00AB
¬
00AC
­
00AD
®
00AE
Ї
0407
B°
00B0
±
00B1
І
0406
і
0456
ґ
0491
µ
00B5

00B6
·
00B7
ё
0451

2116
є
0454
»
00BB
ј
0458
Ѕ
0405
ѕ
0455
ї
0457
CА
0410
Б
0411
В
0412
Г
0413
Д
0414
Е
0415
Ж
0416
З
0417
И
0418
Й
0419
К
041A
Л
041B
М
041C
Н
041D
О
041E
П
041F
DР
0420
С
0421
Т
0422
У
0423
Ф
0424
Х
0425
Ц
0426
Ч
0427
Ш
0428
Щ
0429
Ъ
042A
Ы
042B
Ь
042C
Э
042D
Ю
042E
Я
042F
Eа
0430
б
0431
в
0432
г
0433
д
0434
е
0435
ж
0436
з
0437
и
0438
й
0439
к
043A
л
043B
м
043C
н
043D
о
043E
п
043F
Fр
0440
с
0441
т
0442
у
0443
ф
0444
х
0445
ц
0446
ч
0447
ш
0448
щ
0449
ъ
044A
ы
044B
ь
044C
э
044D
ю
044E
я
044F

Для кодировки cp1251 существуют разновидности (казахская, чувашская и т.д.).

В консоли русифицированных систем семейства Windows NT используется кодировка cp866. Первая часть таблицы кодировки (латиница) полностью соответствует кодировке ASCII. Вторая часть (под символами указаны шестнадцатеричные коды Unicode):


0123 4567 89AB CDEF
8А
0410
Б
0411
В
0412
Г
0413
Д
0414
Е
0415
Ж
0416
З
0417
И
0418
Й
0419
К
041A
Л
041B
М
041C
Н
041D
О
041E
П
041F
9Р
0420
С
0421
Т
0422
У
0423
Ф
0424
Х
0425
Ц
0426
Ч
0427
Ш
0428
Щ
0429
Ъ
042A
Ы
042B
Ь
042C
Э
042D
Ю
042E
Я
042F
Aа
0430
б
0431
в
0432
г
0433
д
0434
е
0435
ж
0436
з
0437
и
0438
й
0439
к
043A
л
043B
м
043C
н
043D
о
043E
п
043F
B
2591

2592

2593

2502

2524

2561

2562

2556

2555

2563

2551

2557

255D

255C

255B

2510
C
2514

2534

252C

251C

2500

253C

255E

255F

255A

2554

2569

2566

2560

2550

256C

2567
D
2568

2564

2565

2559

2558

2552

2553

256B

256A

2518

250C

2588

2584

258C

2590

2580
Eр
0440
с
0441
т
0442
у
0443
ф
0444
х
0445
ц
0446
ч
0447
ш
0448
щ
0449
ъ
044A
ы
044B
ь
044C
э
044D
ю
044E
я
044F
FЁ
0401
ё
0451
Є
0404
є
0454
Ї
0407
ї
0457
Ў
040E
ў
045E
°
00B0

2219
·
00B7

221A

2116
¤
00A4

25A0
 
00A0

Для кодировки cp866 существуют разновидности (чувашская, ГОСТ 19768-87 и т.д.).

Стандартом для русской кириллицы в юникс-подобных операционных системах является кодировка КОИ-8 (код обмена информацией, 8 битов), или KOI8. Существует несколько вариантов кодировки КОИ-8 для различных кириллических алфавитов. Русский алфавит описывается в кодировке KOI8-R, украинский — в KOI8-U, существуют также кодировки KOI8-RU (русско-белорусско-украинская), KOI8-T (таджикская) и т.д.

Разработчики КОИ-8 разместили символы русского алфавита таким образом, что если в тексте, написанном в КОИ-8, убирать восьмой бит каждого символа, то получается "читабельный" текст, хотя он и написан латинскими символами.

Вторая часть кодировки KOI8-R (русская), под символами указаны шестнадцатеричные коды Unicode:


0123 4567 89AB CDEF
8
2500

2502

250C

2510

2514

2518

251C

2524

252C

2534

253C

2580

2584

2588

258C

2590
9
2591

2592

2593

2320

25A0

2219

221A

2248

2264

2265
 
00A0

2321
°
00B0
²
00B2
·
00B7
÷
00F7
A
2550

2551

2552
ё
0451

2553

2554

2555

2556

2557

2558

2559

255A

255B

255C

255D

255E
B
255F

2560

2561
Ё
0401

2562

2563

2564

2565

2566

2567

2568

2569

256A

256B

256C
©
00A9
Cю
044E
а
0430
б
0431
ц
0446
д
0434
е
0435
ф
0444
г
0433
х
0445
и
0438
й
0439
к
043A
л
043B
м
043C
н
043D
о
043E
Dп
043F
я
044F
р
0440
с
0441
т
0442
у
0443
ж
0436
в
0432
ь
044C
ы
044B
з
0437
ш
0448
э
044D
щ
0449
ч
0447
ъ
044A
CЮ
042E
А
0410
Б
0411
Ц
0426
Д
0414
Е
0415
Ф
0424
Г
0413
Х
0425
И
0418
Й
0419
К
041A
Л
041B
М
041C
Н
041D
О
041E
DП
041F
Я
042F
Р
0420
С
0421
Т
0422
У
0423
Ж
0416
В
0412
Ь
042C
Ы
042B
З
0417
Ш
0428
Э
042D
Щ
0429
Ч
0427
Ъ
042A

Юникод, или Уникод (Unicode) - это стандарт кодирования символов, позволяющий представить знаки практически всех письменных языков.

Чаще всего для обозначения символов Unicode используется запись вида "U+xxxx" (для кодов 0...FFFF), где xxx - шестнадцатеричные цифры. Первая версия Юникода представляла собой кодировку с фиксированным размером символа в 16 бит, то есть общее число кодов было 216 (65536). Отсюда и происходит практика обозначения символов четырьмя шестнадцатеричными цифрами (например, U+0410).

Коды в стандарте Unicode разделены на несколько областей, например:

В дальнейшем было принято решение расширить кодовую область, и коды символов стали рассматриваться не как 16-битные значения, а как абстрактные числа, которые в компьютере могут представляться множеством разных способов. Однако, поскольку в ряде компьютерных систем (например, Windows NT) до изобретения Юникода уже были реализованы 16-битные символы, было решено всё наиболее важное кодировать только в пределах первых 65536 позиций (так наз. Basic Multilingual Plane, BMP). Остальное пространство используется для "дополнительных символов" (Supplementary Characters): систем письма вымерших языков или очень редко используемых китайских иероглифов, математических и музыкальных символов.

Стандарт Юникода содержит семейство кодировок (форм представления или UTF, Unicode Transformation Format): UTF-8, UTF-16, UTF-32 и некоторые другие, которые отличаются между собой способом хранения данных (количество байт на символ, фиксированное или нефиксированное количество байт на символ). Была разработана также форма представления UTF-7 для передачи по семибитным каналам, но из-за несовместимости с ASCII она не получила распространения и не включена в стандарт.

UTF-8 - это представление Юникода, обеспечивающее наилучшую совместимость со старыми системами, использовавшими 8-битные символы. Текст, состоящий только из символов с номером меньше 128, при записи в UTF-8 превращается в обычный текст ASCII. И наоборот, в тексте UTF-8 любой байт со значением меньше 128 изображает символ ASCII с тем же кодом. Для совместимости со старыми 16-битными системами была изобретена система UTF-16, где первые 65536 позиций отображаются непосредственно как 16-битные числа, а остальные представляются в виде "суррогатных пар".

В Microsoft Windows NT/2000/XP в основном используется форма UTF-16. В UNIX-подобных операционных системах GNU/Linux, BSD и Mac OS X принята форма UTF-8 для файлов и UTF-32 или UTF-8 для обработки символов в оперативной памяти.

В Юникоде нет русских букв с ударением, но по стандарту их можно делать составными, добавляя символ U+0301 ("combining acute accent") после ударной гласной. Вообще, в Юникоде символы, имеющие дополнительные над- или подстрочные элементы, могут быть представлены в виде построенной по определённым правилам последовательности кодов (составной вариант, composite character) или в виде единого символа (монолитный вариант, precomposed character). Cимволы в Юникоде подразделяются на протяжённые и непротяжённые (бесширинные). Непротяжённые символы при отображении не занимают места в строке. К ним относятся, в частности, знаки ударения и прочие диакритические знаки. Как протяжённые, так и непротяжённые символы имеют собственные коды. Протяжённые символы иначе называются базовыми (base characters), а непротяжённые — модифицирующими (combining characters); причём последние не могут встречаться самостоятельно. Например, символ "a" с ударением может быть представлен как последовательность базового символа "a" (U+0061) и модифицирующего символа U+0301, или как монолитный символ "a" с ударением (U+00C1). Примечание: множество символов из языков с алфавитами на основе кириллицы не имеют монолитных форм.

В Windows служебная программа "Таблица символов" (для вызова наберите "charmap" в командной строке) позволяет вывести на экран таблицу всех символов от U+0000 до U+FFFF, поддерживаемых конкретным шрифтом. Также эта программа позволяет выделять отдельные символы и копировать их в буфер обмена.

В некоторых приложениях, например WordPad и MS Word, работает способ ввода символов по шестнадцатеричному коду: нужно набрать этот код, и нажать Alt+X. Код будет заменён на соответствующий символ. Работает и обратное преобразование: если выделить символ и нажать Alt+X, то этот символ будет заменён на его шестнадцатеричный код.

Кроме того, во многих Windows-приложениях будет работать следующее: если нажать клавишу Alt, и не отпуская её, ввести код на блоке дополнительной цифровой клавиатуры, будет введён соответствующий символ. Таким способом могут вводиться символы различных кодировок по достаточно сложным правилам, которые могут срабатывать по-разному в разных программах, и описаны, например, в статье "Вводим отсутствующие на клавиатуре символы" журнала "Компьютерра" (эту статью можно найти в Интернете).

В HTML все символы могут быть закодированы в числовом обозначении с использованием десятичного (&#DD;) или шестнадцатеричного (&#xHHHH;) кода Unicode. Hапример, буква "Ё": &#x0401; или &#1025;.

В HTML можно использовать также модифицирующие непротяжённые символы, например, для расстановки ударений. Код:

<span style="font-family:Arial">Ма&#x0301;ма мы&#x0301;ла ра&#x0301;му.</span>

Будет отображён так:

Ма́ма мы́ла ра́му.

Разрешение проблем

Благодарность за предоставленные рецепты и пояснения - участнику сообщества под ником YMP.


Иногда значительные неудобства доставляют тексты, сохранённые в неправильной кодировке.

Например, текст в кодировке КОИ-8, сохранённый в кодировке cp1251, выглядит примерно следующим образом:

оНМЪРХЕ ЯЙПХОРХМЦЮ (МЮОХЯЮМХЪ ЯЙПХОРНБ) ПЮАНРЮЕР ДНБНКЭМН УНПНЬН,
ЕЯКХ ОНМХЛЮРЭ ЯЙПХОР ЙЮЙ РЕЮРПЮКЭМШИ ЯЖЕМЮПХИ.
уНРЪ ЯЖЕМЮПХИ ЪБКЪЕРЯЪ ХЯВЕПОШБЮЧЫХЛ,
ОПНПЮАНРЙЮ ДЕРЮКЕИ ХЯОНКМЕМХЪ НЯРЮБКЕМЮ ДЕИЯРБСЧЫХЛ ЮЙРЕПЮЛ Х ПЕФХЯЯЕПС.
й ЯНФЮКЕМХЧ, РЮЙХЛ НАПЮГНЛ МЕКЭГЪ ЯСГХРЭ НОПЕДЕКЕМХЕ ЯЙПХОРНБШУ ЪГШЙНБ:
ЛЮМХОСКХПСЪ ОПХКНФЕМХЪЛХ, КЧАНИ ЪГШЙ МХГЬЕЦН СПНБМЪ ЛНФМН ХЯОНКЭГНБЮРЭ ЙЮЙ ЯЙПХОРНБШИ ЪГШЙ!

Чтобы прочитать такой текст, можно проделать следующее:

  1. Перенесите такой текст через буфер обмена в стандартный редактор Блокнот и сохраните его в текстовом файле.
  2. Переименуйте расширение файла в .htm и откройте его двойным щелчком в Internet Explorer.
  3. В Internet Explorer выполните команду меню "Файл" - "Сохранить как" и сохраните в другой файл с расширением .htm. В диалоге "Сохранение веб-страницы" выберите кодировку "Кириллица (KOI8-R)".
  4. Откройте новый файл двойным щелчком в Internet Explorer и выполните команду меню "Вид" - "Кодировка" - "Кириллица (Windows)".

В некоторых случаях происходят ошибки при копировании текста через буфер обмена из одной программы в другую - вставка может превращать текст в "кракозябры".

Это может происходить из-за того, что приложение, из которого производится копирование, помещает текст в буфер обмена в 8-битной кодировке, а то, в которое происходит вставка, запрашивает его в Юникоде (так делает, например, Блокнот). Windows "идёт навстречу" и перекодирует текст. При копировании в буфер помещается также информация о языке. Это может делать само приложение, а если не делает, то Windows просто смотрит, на какой язык ввода было переключено приложение в момент копирования. Если на русский, то используется страница 1251 и при вставке всё нормально. Но если текст русский, а окно приложения было переключено в английский, кодирование пойдёт через 1252 страницу и вместо русских букв пойдут "кракозябры". В таких случаях может помочь предварительное переключение приложения, из которого производится копирование, на русский.

Обратный случай: русский текст помещён в буфер в Юникоде, когда окно было на английском, а вставляется в 8-битной кодировке. Таблица перекодировки берётся опять не та - 1252. Юникодовских кодов для русских букв там просто нет. Не найдя их, Windows использует подстановочный знак для "неизвестного символа" - отсюда вместо русского текста сплошь вопросительные знаки.

Например, при копировании текста через буфер обмена из некоторых PDF-документов можно получить текст "кракозябрами". При копировании из Adobe Reader текст в буфер помещается как в 8-битной кодировке, так и в Юникоде. Похоже, что Adobe Reader сам его перекодирует до того, как положить в буфер. Локаль буфера он не переключает, она соответствует языку окна. Если приложение, в которое осуществляется вставка, запрашивает текст в 8-битной кодировке, в нём отображается всё нормально, а если в Юникоде - в нём идут "кракозябры". Возможно, в самом PDF-документе содержится информация о том, какую страницу использовать при перекодировке, так как такое происходит, конечно, далеко не во всех PDF-документах. В такой ситуации могут выручить приложения, которые запрашивают текст в 8-битной кодировке, например свободный текстовый редактор AkelPad или PuntoSwitcher с его многокарманным буфером.

Чтобы перенести подобный текст, можно проделать следующее:

  1. Перенесите такой текст через буфер обмена в стандартный редактор Блокнот и сохраните его в текстовом файле. В диалоге "Сохранить как" выберите кодировку "Юникод".
  2. Переименуйте расширение файла в .htm и откройте его двойным щелчком в Internet Explorer.
  3. В Internet Explorer выполните команду меню "Файл" - "Сохранить как" и сохраните в другой файл с расширением .htm. В диалоге "Сохранение веб-страницы" выберите кодировку "Западноевропейская (Windows)".
  4. Откройте новый файл двойным щелчком в Internet Explorer и выполните команду меню "Вид" - "Кодировка" - "Кириллица (Windows)".

Людоговский Александр

Перейти на главную страничку сайта (список статей, файлы для скачивания)

© 2007 http://www.script-coding.com При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.