Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI.docx
Скачиваний:
49
Добавлен:
16.12.2018
Размер:
3.43 Mб
Скачать

Поддержка языков различных стран в dos

Имеется несколько вариантов набора символов IBM, которые называются "кодовые страницы" (code pages). Вариант, используемый в Соединенных Штатах и большинстве европейских стран, называется Code Page 437. В системах, продаваемых в Норвегии, Дании, Португалии и некоторых других странах Европы, используются другие специальные кодовые страницы, в которых содержится больше специальных символов, необходимых для языков этих стран. Недавно некоторые из этих стран начали использовать Code Page 850, в которой содержится меньше графических символов, а больше букв со значками типа знаков ударения и других специальных символов.

Windows поддерживает кодовые страницы, устанавливая шрифты OEM (которые используются работающими в окне приложениями DOS и в программе просмотра буфера обмена), которые соответствуют кодовой странице системы, и устанавливая соответствующие таблицы преобразования для функций CharToOem и OemToChar (о которых будет рассказано позднее).

Программа установки Windows Setup выберет нужные кодовые страницы на основе региональных установок текущей конфигурации системы.

5.7.2 Набор символов ansi

Расширенный набор символов, который Windows и программы для Windows в большинстве случаев используют, называется "набор символов ANSI" (ANSI character set), но фактически он является стандартом ISO.

Когда ваша программа получает сообщение WM_CHAR, параметр wParam содержит символьный код ANSI. Набор символов ANSI показан на рис. 5.8. Как вы можете видеть, коды от 0x20 до 0x7E представляют собой те же самые символы, которые имеются в наборе символов OEM и наборе символов ASCII. Символы, показанные в виде закрашенных прямоугольников, не определены. Они могут оказаться иными на другом устройстве вывода информации (например, на принтере). Шрифты TrueType определяют для кодов ANSI несколько дополнительных символов в диапазоне от 0x80 до 0x9F.

5.7.3 Наборы символов oem, ansi и шрифты

В Windows имеются различные шрифты для вывода на экран символов из набора ANSI и OEM. Когда вы первый раз получаете описатель контекста устройства, то одним из атрибутов контекста устройства является шрифт. По умолчанию им является SYSTEM_FONT или "системный шрифт" (system font), в котором используется набор символов ANSI. Если вы хотите выводить на экран символы из набора OEM, то вы можете выбрать OEM_FIXED_FONT, также называемый "терминальный шрифт" (terminal font) в контекст устройства, используя следующий оператор:

SelectObject(hdc, GetStockObject(OEM_FIXED_FONT));

5.8 Решение проблемы с использованием системы unicode

Производители программ, создающие приложения для международного рынка, вынуждены были иметь дело с нестандартными решениями проблемы 7-разрядного кода ASCII, такими как кодовые страницы и наборы двухбайтных символов. Лучшее решение необходимо, и им становится Unicode, начиная с версии Windows NT.

Unicode — стандарт, первоначально разработанный Apple и Xerox в 1988 г В 1991 г был создан консорциум для совершенствования и внедрения Unicode В него вошли компании Apple, Compaq, Hewlett-Packard, IBM, Microsoft, Oracle, Silicon Graphics, Sybase, Unisys и Xcrox. (Полный список компаний — членов консорциума см. на www.Unicode.org.) Эта группа компаний наблюдает за соблюдением стандарта Unicode, описание которого Вы найдете в книге The Unicode Standard издательства Addison-Wesley (ее электронный вариант можно получить на том же www.Unicode.org).

Строки в Unicode просты и логичны. Все символы в них представлены 16-битными значениями (по 2 байта на каждый). В них нет особых байтов, указывающих, чем является следующий байт — частью того же символа или новым символом. Это значит, что прохождение по строке реализуется простым увеличением или уменьшением значения указателя. Функции CharNext, CharPrev и lsDBCSLeadByte больше не нужны.

Так как каждый символ — 16-битное число, Unicode позволяет кодировать 65 536 символов, что более чем достаточно для работы с любым языком. Разительное отличие от 256 знаков, доступных в однобайтовом наборе!

В настоящее время кодовые позиции определены для арабского, китайского, греческого, еврейского, латинского (английского) алфавитов, а также для кириллицы (русского), японской каны, корейского хантыль и некоторых других алфавитов. Кроме этого, в набор символов включено большое количество знаков препинания, математических и технических символов, стрелок, диакритических и других знаков. Все вместе они занимают около 35 000 кодовых позиций, оставляя простор для будущих расширений. Эти 65 536 символов разбиты на отдельные группы. Некоторые группы, а также включенные в них символы показаны в таблице

16-битный код

Символы

16-битный код

Символы

0000-007F

ASCII

0300-U36F

Общие диакритические

0080-00FF

Символы Latin 1

0400-04FF

Кириллица

0100-017F

Европейские латинские

0530-058F

Армянский

01 80-01FF

Расширенные латинские

0590-05FF

Еврейский

0250-02AF

Стандартные фонетические

0600-06FF

Арабский

02BO-02FF

Модифицированные литеры

0900-097F

Деванагари

Около 29 000 кодовых позиций пока не заняты, но зарезервированы на будущее. Примерно 6 000 позиций оставлено специально для программистов (на их усмотрение).

5.8.1 Windows и Unicode

В наше время Windows целиком и полностью построена на Unicode. Все базовые функции для создания окон, вывода текста, операций со строками и т. д. ожидают передачи Unicode-строк. Если какой-то функции Windows передается ANSI-строка, она сначала преобразуется в Unicode и лишь потом передается операционной системе. Если Вы ждете результата функции в виде ANSI-строки, операционная система преобразует строку — перед возвратом в приложение - из Unicode в ANSI. Все эти преобразования протекают скрытно от Вас, но, конечно, на них тратятся и лишнее время, и лишняя память. Поэтому гораздо эффективнее разрабатывать программу, с самого начала ориентируясь на Unicode.

Microsoft разработала Windows API так, чтобы как можно меньше влиять на Ваш код. В самом деле, у Вас появилась возможность создать единственный файл с исходным кодом, компилируемый как с применением Unicode, так и без него, — достаточно определить два макроса (UNICODE и _UNICODE), которые отвечают за нужные изменения.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]