【问题标题】:Delphi - Get Windows' default non-unicode character setDelphi - 获取 Windows 的默认非 Unicode 字符集
【发布时间】:2013-03-31 11:54:23
【问题描述】:

我有一个 Delphi 7 应用程序。我需要能够获得非 unicode 程序的默认 Windows 字符集。我知道 DEFAULT_CHARSET 设置它,但我需要确切知道它是哪个字符集,以便我可以将它与其他字符集进行比较。这可能吗?如何实现?

谢谢!

【问题讨论】:

  • 我想是GetACP
  • 你能准确定义你想要什么。 Windows 字符集不精确。
  • @WarrenP - 谢谢,这对我有用!现在,将代码页转换为 TFontCharset 的最佳方法是什么? David Hefferman - 我们正在讨论 DEFAULT_CHARSET 设置的字符集,基于在 Windows 的区域和语言设置中为"Language for non-Unicode programs"选择的语言

标签: delphi character-encoding non-unicode


【解决方案1】:

GetFontData 正在调用 GetObject 并使用 LogFont.lfCharSet 来确定字符集

GetObject called with HFONT 将填写 LogFont 这里的定义是

DEFAULT_CHARSET 设置为基于当前系统的值 语言环境。例如,当系统区域设置为英语(美国)时,设置为 ANSI_CHARSET。

GetCPInfoEx with CP_ACP 提供CPINFOEX 结构将提供系统默认 Windows ANSI 代码页。

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;

【讨论】:

  • @bummi - 我无法尝试这个,因为我的 Delphi 7 Windows 单元中似乎没有声明 TCPInfoEx 和 GetCPInfoEx。与 Warren P 建议的那样简单地使用 GetACP(实际上是在 Windows 单元中声明 )相比,使用此方法有什么优势或区别?
  • 应该导致相同的结果,此链接向 GetACP msdn.microsoft.com/en-us/library/windows/desktop/… 提供信息,在指向 GetCPInfo 的链接之后指向 GetCPInfoEx 的链接
  • @jedi 添加缺少的声明非常简单。
【解决方案2】:

这是 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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 2023-04-07
    • 2021-08-03
    • 2016-09-18
    • 1970-01-01
    • 2011-09-21
    相关资源
    最近更新 更多