Кодировки. Почему русский тексттак ужасно выглядит?

Представьте себе, что вам потребовалась небольшая программка на языке VisualFoxPro, которая уже есть у вашего знакомого. Он с радостью одолжил вам программку, но предупредил, что она написана для MS DOS, например, на FoxPro 2.6.Вы его сердечно благодарите и открываете ее в среде Visual FoxPro 9, что сделать имеете полное право, поскольку обратная совместимость весьма неплохообеспечивается. Программа появилась в окне на экране... Но что это?! На экранвместо осмысленных текстовых сообщений на русском языке выводятся какие-то странные символы! Может, это вирус?!

Дело в том, что каждый символ обозначается специальным кодом. Наборкодов для обозначения всех символов называется кодировкой (или кодовойстраницей). Кодировки бывают разные. Главным образом они отличаются набором символов национальных алфавитов. Каждая кодировка имеет свое название. Как правило, современные операционные системы изначально поддерживают несколько кодировок и позволяют добавлять для использованияновые. В операционной системе MS DOS в качестве основной используетсяодна кодировка (866 - Russian MS DOS), а в операционных системах семействаWindows - другая (1251 - Russian Windows).

Как же выйти из ситуации с программкой? В стандартном окне открытияфайла, где вы выбираете, какой файл с программой будет открыт, есть кнопкаCode Page (Кодовая страница). При щелчке мышью по этой кнопке открывается окно со списком кодировок (рис. 3.5). В этом окне можно выбрать ту кодировку, в которой создавалась программа. После выбора кодировки надо щелкнуть по кнопке Select (Выбрать).

В результате действий, указанных выше, откроется текст программы, гдесообщения на русском языке будут вполне читаемы. Однако это не значит, чтов среде Visual FoxPro при запуске программы, написанной в кодировке MS DOS,все сообщения будут выводиться корректно. Что же делать, если требуется использовать такую программу, запуская ее в среде Visual FoxPro 9? Самый простой способ - после корректного открытия файла с программой, когда все русские сообщения читаются нормально, выбрать из меню File (Файл) командуSave As (Сохранить как) и в открывшемся диалоговом окне сохранения файлаперед щелчком по кнопке Save (Сохранить) щелкнуть по кнопке Code Page(Кодовая страница). При щелчке мышью но этой кнопке открывается окно сосписком кодировок (см. рис. 3.5). В этом окне нужно выбрать ту кодировку, вкоторой вы в данный момент работаете (если программа должна выполнятьсяв операционной системе семейства Windows, надо выбрать 1251 - RussianWindows). После выбора кодировки надо щелкнуть по кнопке Select (Выбрать). В результате программа сохранится в новой кодировке. При следующем открытии файла с программой уже не нужно указывать, например, кодировку MS DOS, так как мы сохранили этот файл с новой кодировкой.

С аналогичной проблемой сталкиваются и при работе с таблицами, созданными в других кодировках. Однако с таблицами дело обстоит несколько проще. Кодировка, которая используется в текстовых полях таблицы, прописывается в заголовок файла с таблицей. По этой причине большинство созданных вдругих кодировках файлов с таблицами откроются и отобразятся достаточнокорректно.

Исключение составляют файлы с таблицами, где кодировка не прописана.Например, когда создавались базы данных в FoxPro для MS DOS, никто и непомышлял о будущей операционной системе Windows и особенно не задумывался о разнообразии кодовых страниц. В dbf-файлах присутствовало зарезервированное поле, которое впоследствии стали использовать для хранения обозначения кодировки, но в те времена оно оставалось пустым.

В случаях, когда кодировка не прописана в файле, при первом открытиитаблицы появляется запрос с перечнем кодовых страниц. Будьте внимательныпри выборе кодировки!!! Обозначение выбранной кодировки пропишется в заголовок файла с таблицей, и при повторном открытии таблицы запрос на выборкодировки появляться не будет! Конечно, безвыходных ситуаций не бывает, ноисправление ошибочно заданной кодировки потребует времени и определенной сноровки. Например, для этой цели предусмотрена программа CPZERO,поставляемая вместе с Visual FoxPro 9. Эта программа позволяет удалить обозначение кодовой страницы из файла таблицы. При открытии таблицы после

операции удаления снова появится запрос кодовой страницы, и вы сможетесделать правильный выбор. Пример таблицы, открытой с неправильно выбранной кодировкой, показан на рис. 3.6.

Если при первом открытии таблицы окно для выбора кодовой страницы не появилось, выполните следующие действия:

>    выберите в меню Tools (Инструменты) команду Options (Параметры);

>    в появившемся окне перейдите на вкладку Data (Данные);

>    проверьте, установлен ли флажок Prompt for code page (Запрос на кодовую страницу).

Для перекодировки открытой таблицы (когда требуется записать текстовыеполя в новой кодировке) можно использовать команду COPY ТО с указаниемпосле ключевого слова AS новой кодовой страницы. Например:

В результате работы указанных команд таблица Persons будет скопирована втаблицу DosPers, причем текстовые поля в новой таблице будут сохранены вкодировке 866 - Russian MS DOS.

Определить кодовую страницу, в которой хранятся символьные поля текущей или заданной открытой таблицы, можно при помощи функцииCPDBF ( ).

Например, таблица Persons создана в Visual FoxPro 9 под управлением операционной системы семейства Windows с установками кодовой страницы поумолчанию (то есть специально мы кодовую страницу не задавали):

MESSAGEBOX(CPDBF("Persons"), "Кодировка")

Результат работы этой функции представленна рис. 3.7.

Текст, хранящийся в символьных переменных, также имеет определенную кодировку. Есливы присвоите переменной 1с_р8 66 значениеполя таблицы в кодировке 866 - Russian MS DOS,которое содержит слово "мир", а переменнойlc_w - значение поля таблицы в кодировке 1251 -Russian Windows, которое также содержит слово "мир", и сравните их, то равенства не получится. Перекодировать переменную из одной кодировки в другую можно с помощью функции CPCONVERT ().

Например:

Указанная команда перекодирует переменную lc_Str2 из кодировки 1251 вкодировку 866 и помещает результат в переменную lc_Strl.

Как было сказано выше, каждый символ имеет свой код. В язык Visual FoxPro 9включен ряд функций, позволяющих определять код символа и возвращающихсимвол по введенному коду. Рассмотрим их.

Функция ASC () возвращает код ANSI указанного символа.

Например:


Функция, возвращающая символ, соответствующий введенному коду, -

CHR().

Например:

Чаще всего функцией CHR () пользуются для вставки в строки специальныхсимволов, таких как перевод строки (CHR (13) ), конец строки (CHR(IO)) илидругие подобные символы.

Кодировки, поддерживаемые в Visual FoxPro 9, приведены в табл. 3.10.