Инструкция
1
Дело в том, что кодировки OEM и ANSI (в которой работает Delphi) не совпадают. В них различны позиции кириллических символов. В ANSI также имеются диакритические символы, коих в OEM нет. Зато во второй присутствуют символы псевдографики, которые незаменимы при изображении таблиц, хотя это и не очень востребовано. И все же стоит заметить, что в целом эти таблицы взаимозаменяемы – возможности вывода текстовой информации у них одинаковы.
2
Есть несколько способов решения проблемы русификации. Первый – работа в OEM-редакторе. Можно изначально подготовить критичные к кодовой таблице части текста программы в редакторе, который работает в кодировке OEM. Довольно простое, но в то же время эффективное решение. Особенно это касается написания локальных утилит, в коих вывод информации, тем не менее, востребован сильно.
3
Что касается недостатков данного способа, тут можно обозначить работу вне привычного многим IDE с его наворотами, которые здорово отличают жизнь, как то: кодирование, компиляция, отладка. И все это, что говорится, «в одном флаконе». Кроме того, при разрастании проекта начинают проявляться определенные сложности, когда начинают использоваться созданные при помощи кодировки ANSI сторонние строковые ресурсы.
4
Если проект непосредственно включенных в код строк (hard-coded) не содержит, можно вынести все строковые ресурсы в отдельные модули, локализуя их затем под ту кодировку, которая требуется. Благо утилит, которые меняют кодировку файлов, в сети полно.
5
Теперь об использовании фильтрующих процедур. В Windows API содержатся функции, помогающие преобразовывать кодировки ANSI и OEM одна в другую. Это OemToChar и CharToOem. Они и используются при выводе текста с заменой фрагментов Writeln(‘текст'); на следующие фрагменты:
procedure MyWriteln(const S: string);
var
NewStr: string;
begin
SetLengtn(NewStr, Length(S));
CharToOem(PChar(S), PChar(NewStr));
Writeln(NewStr);
end;
...
MyWriteln(‘текст');
procedure MyWriteln(const S: string);
var
NewStr: string;
begin
SetLengtn(NewStr, Length(S));
CharToOem(PChar(S), PChar(NewStr));
Writeln(NewStr);
end;
...
MyWriteln(‘текст');
6
Что касается недостатков этого способа, это невозможность использовать расширенный синтаксис Write и захламление текста приложения вызовом фильтрующих процедур. Когда надо русифицировать готовое приложение с множественными обращениями к Write, это становится серьезной проблемой.
7
И последнее – изменение кодовой страницы консоли при помощи средств Windows API. Метод этот документированный, кстати. Только загвоздка в том, что функция в Windows 95 и 98 не работает. Хотя если работать приложение будет исключительно в Windows NT, в этом случае можно взять на вооружение функцию SetConsoleOutputCP(866).
Видео по теме