Visual2000 · Архив статей А.Колесова & О.Павловой
Андрей Колесов
© 1999, Андрей КолесовПроблема оптимального кодирования символов, наверное, берет свое историческое начало с создания телеграфа, где применялось 4-х битовое обозначение. 5-й разряд на перфоленте был контрольным. Для перехода от одного набора символов к другому использовались специальные символы "смены регистра". На смену этому коду пришел 7-битовый (8-й — контрольный), который позволил одному языку (английскому или русскому) умещаться полностью. Поэтому именно он положил основу системе ASCII (American Standard Code for Information Interchange) еще задолго до создания современных компьютеров.
Переход на "байтовый" принцип хранения информация произошел только в конце 60-х годов, но тем не менее в компьютерной технике еще долго доминировал 7-разрядный код (американских разработчиков тогда не очень волновала проблема завоевания зарубежных рынков, и уже тем более — адаптации к национальным языкам).
В результате "локализация" ПО для зарубежных стран (для СССР, в частности) решалась простой заменой строчных английских букв прописными русскими. Таким образом, до конца 80-х годов советские программисты работали только с верхним регистром английского и русского алфавита.
Решением проблемы использования национальных языков стал переход к системе ANSI (American National Standards Institute) и DBCS (Double-Byte Character Set). ANSI является сегодня наиболее популярным символьным стандартом для ПК, в котором используется 8-битовое кодирование (до 256 кодов). Основу его составляет традиционная (основная) таблица ASCII (0-127), дополненная еще 128 символами, которые иногда называют "расширенной" таблицей ASCII. Именно поэтому ANSI часто называют расширенным вариантом ASCII (или даже в качестве синонима ACSII, что на самом деле не совсем верно).
ANSI применяется в основном для европейских языков, которые основаны на классическом латинском алфавите, но в отличие от английского языка имеют некоторые дополнительные символы, а еще чаще — варианты расширений типа "A с точкой", "I с двумя точками" и пр.
Русский язык (кириллица) также смогла уместиться в дополнительный набор символов (33 буквы), но с некоторыми проблемами. Дело в том, что многие коды из состава таблицы 128-255 уже использовались (без соответствующей стандартизации) в целом ряде программ для некоторых специальных целей (американским разработчикам не приходило в голову тогда, что их программы будут использоваться в России). В качестве классических примеров можно вспомнить русскую "р", которую не признавал Norton Commander 3.0 для DOS, или FoxBase, который считал русскую "Н" переводом строки.
Таких "тяжелых" наследий прошлого было довольно много и именно этим во много объясняется наличие специальных "панъевропейских версий" Windows до 95 включительно — адаптация к использованию подобных нестандартизованных спецсимволов требовала специальной коррекции кода.
Однако многим языкам (в основном азиатским) дополнительных 128 символов никак не хватало. Поэтому появилась система DBCS, которая строится по другому принципу. Для латинских букв она использует кодировку ASCII (0-127). Для своих собственных символов (японский набор включает около 12 тыс. символов) она использует двухбайтовый набор, когда первый код (128-255) выполняет функцию упреждающего, а следующий является его дополнением. Легко посчитать, что такая кодировка позволяет использовать 32K+128 символов.
UniCode — это схема кодирования символов, которая использует на каждый символ два байта: первый байт определяет как бы номер набора символов, второй — собственно код символа. Например, набор символов английского и западноевропейских языков (cp1252) имеет код первого байта 0, восточноевропейских (cp1250) — 1, русского (кириллица, cp1251) — 4.
Эта система продвигается Международной организацией по стандартизации (ISO) в качестве универсального единого стандарта. И если говорить о программном обеспечении компьютеров, то она сейчас переживает непростой период перехода от ANSI/DBCS к Unicode, когда в силу огромного информационного наследства приходится использовать смешанные варианты кодирования. Именно этим во многом определяется значительная путаница с преобразованием кодов символов, о которой мы говорим сейчас на примере VB.
Типичным примером является Microsoft Windows 9x, ядро и WinAPI которой по-прежнему используют кодировку ANSI/DBCS. Однако многие ее компоненты, а также автономные приложения (в частности, VB и Office) применяют Unicode (см. таблицу 1).
Подчеркну, что хотя Unicode и DBCS имеют двухбайтовые символы и покрывают набор символов примерно одного объема, их схемы кодирования абсолютно различны. С точки зрения программистов, принципиальным моментом является следующее: ANSI использует строго один байт на символ, Unicode — строго два байта, а DBCS — 1-2 байта, в зависимости от используемых символом.
Кроме того, известной проблемой русского языка является наличие несколько однобайтовых кодировок символов (см. таблицу 2). Строго говоря, ANSI кодировкой для кириллицы является таблица Windows cp1251.
Компоненты Windows | Используемые наборы символов |
Visual Basic | Unicode |
32-разрядные библиотеки объектов | Unicode |
16-разрядные библиотеки объектов | ANSI/DBCS |
Windows NT API | Unicode |
Windows 9x API | ANSI/DBCS |
Automation в Windows NT | Unicode |
Automation в Windows 9x API | Unicode |
Символ |
Кодовые таблицы |
|||||
Win(cp1251) | Unicode | KOI8-R | DOS,cp866 (альтернативная) |
IS08859-5 (основная) |
Mac | |
А | C0 | 0410 | E1 | 80 | B0 | 80 |
Б | C1 | 0411 | E2 | 81 | B1 | 81 |
В | C2 | 0412 | F7 | 82 | B2 | 82 |
Г | C3 | 0413 | E7 | 83 | B3 | 83 |
Д | C4 | 0414 | E4 | 84 | B4 | 84 |
Е | C5 | 0415 | E5 | 85 | B5 | 85 |
Ж | C6 | 0416 | F6 | 86 | B6 | 86 |
З | C7 | 0417 | FA | 87 | B7 | 87 |
И | C8 | 0418 | E9 | 88 | B8 | 88 |
Й | C9 | 0419 | EA | 89 | B9 | 89 |
К | CA | 041A | EB | 8A | BA | 8A |
Л | CB | 041B | EC | 8B | BB | 8B |
М | CC | 041C | ED | 8C | BC | 8C |
Н | CD | 041D | EE | 8D | BD | 8D |
О | CE | 041E | EF | 8E | BE | 8E |
П | CF | 041F | F0 | 8F | BF | 8F |
Р | D0 | 0420 | F2 | 90 | C0 | 90 |
С | D1 | 0421 | F3 | 91 | C1 | 91 |
Т | D2 | 0422 | F4 | 92 | C2 | 92 |
У | D3 | 0423 | F5 | 93 | C3 | 93 |
Ф | D4 | 0424 | E6 | 94 | C4 | 94 |
Х | D5 | 0425 | E8 | 95 | C5 | 95 |
Ц | D6 | 0426 | E3 | 96 | C6 | 96 |
Ч | D7 | 0427 | FE | 97 | C7 | 97 |
Ш | D8 | 0428 | FB | 98 | C8 | 98 |
Щ | D9 | 0429 | FD | 99 | C9 | 99 |
Ъ | DA | 042A | FF | 9A | CA | 9A |
Ы | DB | 042B | F9 | 9B | CB | 9B |
Ь | DC | 042C | F8 | 9C | CC | 9C |
Э | DD | 042D | FC | 9D | CD | 9D |
Ю | DE | 042E | E0 | 9E | CE | 9E |
Я | DF | 042F | F1 | 9F | CF | 9F |
а | E0 | 0430 | C1 | A0 | D0 | E0 |
б | E1 | 0431 | C2 | A1 | D1 | E1 |
в | E2 | 0432 | D7 | A2 | D2 | E2 |
г | E3 | 0433 | C7 | A3 | D3 | E3 |
д | E4 | 0434 | C4 | A4 | D4 | E4 |
е | E5 | 0435 | C5 | A5 | D5 | E5 |
ж | E6 | 0436 | D6 | A6 | D6 | E6 |
з | E7 | 0437 | DA | A7 | D7 | E7 |
и | E8 | 0438 | C9 | A8 | D8 | E8 |
й | E9 | 0439 | CA | A9 | D9 | E9 |
к | EA | 043A | CB | AA | DA | EA |
л | EB | 043B | CC | AB | DB | EB |
м | EC | 043C | CD | AC | DC | EC |
н | ED | 043D | CE | AD | DD | ED |
о | EE | 043E | CF | AE | DE | EE |
п | EF | 043F | D0 | AF | DF | EF |
р | F0 | 0440 | D2 | E0 | E0 | F0 |
с | F1 | 0441 | D3 | E1 | E1 | F1 |
т | F2 | 0442 | D4 | E2 | E2 | F2 |
у | F3 | 0443 | D5 | E3 | E3 | F3 |
ф | F4 | 0444 | C6 | E4 | E4 | F4 |
х | F5 | 0445 | C8 | E5 | E5 | F5 |
ц | F6 | 0446 | C3 | E6 | E6 | F6 |
ч | F7 | 0447 | DE | E7 | E7 | F7 |
ш | F8 | 0448 | DB | E8 | E8 | F8 |
щ | F9 | 0449 | DD | E9 | E9 | F9 |
ъ | FA | 044A | DF | EA | EA | FA |
ы | FB | 044B | D9 | EB | EB | FB |
ь | FC | 044C | D8 | EC | EC | FC |
э | FD | 044D | DC | ED | ED | FD |
ю | FE | 044E | C0 | EE | EE | FE |
я | FF | 044F | D1 | EF | EF | DF |
Ё | A8 | 0401 | B3 | F0 | A1 | DD |
ё | B8 | 0451 | A3 | F1 | F1 | DE |