От ASCII к ANSI/DBCS и Unicode.

Это статья взята с сайта Microsoft Developer Network.

Возможно, просмотр некоторых символов у Вас будут отображаться не правильно. Зависит это от используемого шрифта, лучше установить шрифт Arial Unicode MS.

Суть проблемы:
Перекодировка и обработка строк: От ASCII к ANSI/DBCS и Unicode.

Проблема оптимального кодирования символов, наверное, берет свое историческое начало с создания телеграфа, где применялось 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.

Использование схем кодирования символов в Microsoft Windows.
Компоненты 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
Шестнадцатиричные коды русских букв в различных кодовых таблицах для кириллики (Cyrillic).
Символ Кодовые таблицы
  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
Нужен оригинальный шрифт?
Нет проблем - fontproblem@yandex.ru
Hosted by uCoz