Стандартная Кодовая Страница Windows для не-UNICODE Программ на Delphi 7
Вопрос пользователя связан с необходимостью получения стандартной кодовой страницы Windows для не-UNICODE программ в приложении Delphi 7. Это необходимо для сравнения с другими кодовыми страницами и корректной работы с текстом в программе.
Решение проблемы
Стандартная кодовая страница Windows, установленная для не-UNICODE программ, определяется значением DEFAULT_CHARSET. Это значение зависит от текущей локали системы. Например, для английского (США) это будет ANSI_CHARSET. Для получения этой информации можно использовать функцию GetCPInfoEx с параметром CP_ACP, которая возвращает информацию о стандартной кодовой странице в структуре CPINFOEX.
Пример кода
Ниже приведен пример кода на Object Pascal (Delphi), который демонстрирует, как получить стандартную кодовую страницу Windows:
unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Forms;
type
_cpinfoex = record
MaxCharSize: UINT; { максимальный размер символа в байтах }
DefaultChar: array[0..MAX_DEFAULTCHAR - 1] of Byte; { символ по умолчанию }
LeadByte: array[0..MAX_LEADBYTES - 1] of Byte; { диапазоны ведущих байтов }
UnicodeDefaultChar: WCHAR;
CodePage: UINT;
CodePageName: array[0..MAX_PATH] of char;
end;
TCPInfoEx = _cpinfoex;
{$EXTERNALSYM CPINFOEX}
CPINFOEX = _cpinfoex;
{$EXTERNALSYM GetCPInfoEx}
type
TForm1 = class(TForm)
procedure FormShow(Sender: TObject);
private
procedure Check;
public
end;
function GetCPInfoEx(CodePage: UINT; dwFlags: DWORD; var lpCPInfoEx: TCPInfoEx): BOOL; stdcall;
function GetCPInfoEx; external 'kernel32.dll' name 'GetCPInfoExA';
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormShow(Sender: TObject);
begin
Check;
end;
procedure TForm1.Check;
var
CPInfoEx: TCPInfoEx;
CD: Cardinal;
CharsetInfo: TCharSetInfo;
CSN, CodePageName, s, info: String;
i: Integer;
begin
if GetCPInfoEx(CP_ACP, 0, CPInfoEx) then
begin
info := 'CodePage: ' + IntToStr(CPInfoEx.CodePage) + #10;
CodePageName := '';
i := 0;
repeat
CodePageName := CodePageName + CPInfoEx.CodePageName[i];
Inc(i);
until CPInfoEx.CodePageName[i] = #0;
info := info + 'CodePageName: ' + CodePageName + #10;
info := info + 'MaxCharSize: ' + IntToStr(CPInfoEx.MaxCharSize) + ' bytes.' + #10;
s := '';
for i := 0 to MAX_DEFAULTCHAR - 1 do
s := s + IntToStr(CPInfoEx.DefaultChar[i]) + ' ';
info := info + 'DefaultChar: ' + s + #10;
s := '';
for i := 0 to MAX_LEADBYTES - 1 - 1 do
s := s + IntToStr(CPInfoEx.LeadByte[i]) + ' ';
info := info + 'LeadByte: ' + s + #10;
info := info + 'UnicodeDefaultChar: ' + CPInfoEx.UnicodeDefaultChar;
if TranslateCharsetInfo(CPInfoEx.CodePage, CharsetInfo, TCI_SRCCODEPAGE) then
begin
CharsetToIdent(CharsetInfo.ciCharset, CSN);
info := info + ' - ' + IntToStr(CharsetInfo.ciCharset) + ' - ' + CSN + #10;
end;
ShowMessage(info);
end;
end;
// Необходимо добавить определения для TCPInfoEx и GetCPInfoEx, если они не объявлены в модуле Windows.
{$IFDEF _DEBUG}
{$DEFINE EXTERNALSYM}
{$IFDEF UNICODE}
{$EXTERNALSYM CPINFOEXW}
{$EXTERNALSYM GetCPInfoExW}
{$ELSE}
{$EXTERNALSYM CPINFOEXA}
{$EXTERNALSYM GetCPInfoExA}
{$ENDIF}
{$ENDIF}
end.
Конвертация в TFontCharset
Для использования полученной информации о кодовой странице в объекте TFont, можно использовать функцию TranslateCharsetInfo, которая конвертирует кодовую страницу в соответствующий идентификатор TFontCharset.
Заключение
Используя предложенный код, можно получить стандартную кодовую страницу Windows для не-UNICODE программ, которая зависит от настроек локали системы. Это позволяет сравнивать кодовую страницу с другими и использовать ее в работе с текстом в приложении Delphi 7.
Описание: Вопрос касается извлечения информации о стандартной кодовой странице Windows для не-UNICODE программ в среде разработки Delphi 7 для корректной работы с текстом и его сравнения с другими кодовыми страницами.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.