2013-03-31 2 views
3

У меня есть приложение Delphi 7. Мне нужно получить набор символов Windows по умолчанию для программ, отличных от юникода. Я знаю, что DEFAULT_CHARSET задает его, но мне нужно точно знать, какая кодировка, чтобы я мог сравнивать его с другими наборами символов. Это возможно и как?Delphi - установить набор символов по умолчанию для Unicode по умолчанию

Спасибо!

+5

Я думаю, что это 'GetACP'. –

+0

Можете ли вы точно определить, что хотите. Набор символов Windows нечеткий. –

+0

@WarrenP - спасибо, это сработало для меня! Теперь, каким будет лучший способ конвертировать страницу кода в TFontCharset? Дэвид Хефферман - мы говорим о наборе символов, установленном в DEFAULT_CHARSET, в зависимости от того, какой язык выбран в настройках «Региональный язык и язык Windows» для [«Язык для программ, отличных от Юникода»] (http://www.microsoft.com/) ресурсы/документация/windows/xp/all/proddocs/en-us/int_pr_select_language_version.mspx? mfr = true) – jedivader

ответ

5

GetFontData звонит GetObject и используя LogFont.lfCharSet определить кодовую страницу

GetObject called with HFONT заполнит LogFont Определение здесь является

DEFAULT_CHARSET устанавливается на значение, основанное на текущей системы локали. Например, когда язык системы является английским (Соединенные Штаты), он устанавливается как ANSI_CHARSET.

GetCPInfoEx with CP_ACP доставка CPINFOEX структуры будет поставлять системы по умолчанию кодовой страницы ANSI для Windows.

var 
CPInfoEx:TCPInfoEx; 
CD:Cardinal; 
CharsetInfo:TCharSetInfo; 
CSN:String; 
begin 
If GetCPInfoEx(CP_ACP,0,CPInfoEx) then 
    begin 
    CD := CPInfoEx.Codepage; 
    if TranslateCharsetInfo(CD,CharsetInfo,TCI_SRCCODEPAGE) then 
     begin 
     CharsetToIdent(CharsetInfo.ciCharset,CSN); 
     Showmessage(CPInfoEx.CodePageName+' - '+IntToStr(CharsetInfo.ciCharset)+' - '+CSN); 
    end; 
    end; 
end; 
+0

Будет ли идентификатор кодовой страницы равным идентификатору набора символов? – OnTheFly

+0

@bummi - я не мог попробовать это, поскольку TCPInfoEx и GetCPInfoEx, похоже, не объявлены в моем блоке Windows Delphi 7. Есть ли какие-либо преимущества или различия в использовании этого метода, а не просто использование GetACP (которое на самом деле было объявлено в блоке Windows), как предлагал Warren P? – jedivader

+0

Должен привести к тому же результату, эта ссылка предоставляет информацию GetACP http://msdn.microsoft.com/en-us/library/windows/desktop/dd318070(v=vs.85).aspx после llink для GetCPInfo ведет к ссылке на GetCPInfoEx – bummi

0

Вот полный пример для Delphi 7.

unit Main; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls; 

type 
    _cpinfoex = record 
    MaxCharSize: UINT; { max length (bytes) of a char } 
    DefaultChar: array[0..MAX_DEFAULTCHAR - 1] of Byte; { default character } 
    LeadByte: array[0..MAX_LEADBYTES - 1] of Byte; { lead byte ranges } 
    UnicodeDefaultChar : WCHAR; 
    CodePage : UINT; 
    CodePageName : array[0..MAX_PATH] of char; 
    end; 
    TCPInfoEx = _cpinfoex; 
    {$EXTERNALSYM CPINFOEX} 
    CPINFOEX = _cpinfoex; 
    {$EXTERNALSYM GetCPInfoEx} 

    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 name 'GetCPInfoExA'; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

procedure TForm1.Check; 
var 
v_CPInfoEx : TCPInfoEx; 
v_CD : Cardinal; 
v_CharsetInfo : TCharSetInfo; 
v_CSN, 
v_CodePageName, 
v_s, v_info : String; 
v_i : Integer; 
begin 
If GetCPInfoEx(CP_ACP, 0, v_CPInfoEx) then 
    begin 
    v_info := 'CodePage: '+IntToStr(v_CPInfoEx.CodePage)+#13; 

    v_CodePageName := ''; 
    v_i := 0; 
    repeat 
     v_CodePageName := v_CodePageName + v_CPInfoEx.CodePageName[v_i]; 
     inc(v_i); 
    until v_CPInfoEx.CodePageName[v_i] = #0; 
    v_info := v_info + 'CodePageName: '+v_CodePageName+#10#13; 

    v_info := v_info + 'MaxCharSize: '+IntToStr(v_CPInfoEx.MaxCharSize)+' bytes.'+#13; 

    v_s := ''; 
    for v_i := 0 to MAX_DEFAULTCHAR - 1 do 
     v_s := v_s + IntToStr(v_CPInfoEx.DefaultChar[v_i])+' '; 
    v_info := v_info + 'DefaultChar: '+v_s+#13; 

    v_s := ''; 
    for v_i := 0 to MAX_LEADBYTES - 1 - 1 do 
     v_s := v_s + IntToStr(v_CPInfoEx.LeadByte[v_i])+' '; 
    v_info := v_info + 'LeadByte: '+v_s+#13; 

    v_info := v_info + 'UnicodeDefaultChar: '+v_CPInfoEx.UnicodeDefaultChar; 

    ShowMessage(v_info); 
    end; 
end; 

procedure TForm1.FormShow(Sender: TObject); 
begin 
    Check; 
end; 

end. 
Смежные вопросы