Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在delphi中获得双字节操作系统语言?_Delphi_Winapi_Delphi 10.1 Berlin - Fatal编程技术网

如何在delphi中获得双字节操作系统语言?

如何在delphi中获得双字节操作系统语言?,delphi,winapi,delphi-10.1-berlin,Delphi,Winapi,Delphi 10.1 Berlin,我想检测操作系统的语言是否为双字节。 要获取语言,我正在使用windows的GetLocaleInfo函数。但我想检测语言是否为双字节。我可以通过取语言的名称来确定它是双字节还是非双字节(即,如果语言是日语,那么它的双字节),但是否有其他方法可以直接获取操作系统的双字节语言 我用于获取语言的代码: procedure GetLanguage(); var Buffer : PChar; Size : integer; begin Size := G

我想检测操作系统的语言是否为双字节。 要获取语言,我正在使用windows的GetLocaleInfo函数。但我想检测语言是否为双字节。我可以通过取语言的名称来确定它是双字节还是非双字节(即,如果语言是日语,那么它的双字节),但是否有其他方法可以直接获取操作系统的双字节语言

我用于获取语言的代码:

procedure GetLanguage();
    var
    Buffer : PChar; 
     Size : integer;
    begin
      Size := GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SENGLANGUAGE, nil, 0);
      GetMem(Buffer, Size);
      try
        GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SENGLANGUAGE, Buffer, Size);
        Writeln(Buffer);
      finally
        FreeMem(Buffer);
      end;
    end;
什么叫“双字节”?您的意思是,当使用AnsiString时,它可能会使用两个AnsiChar编码字符

使用以下代码:

FarEast := GetSystemMetrics(SM_DBCSENABLED) <> 0;
FarEast:=GetSystemMetrics(SM_DBCSENABLED)0;

编辑,因为Unicode Delphi上的SysLocale.FarEast强制为true。

操作系统支持双字节字符,但我的问题是操作系统的语言是日语,然后是双字节字符语言,如果语言是英语,则不是双字节字符语言。你的回答告诉我user32.dll是否支持双字节字符。我使用您的ans进行调试。但是SysLocale.FarEast的值在日语和英语操作系统中都是正确的,这是因为它确实支持DBCS@Arnaud您在最新的Delphi中是对的:{$IF DEFINED(UNICODE)}SysLocale.FarEast:=True;{$ELSE}SysLocale.FarEast:=GetSystemMetrics(SM_DBCSENABLED)0;{$ENDIF}其中IMHO不正确,用于Ansi*()函数。所以我编辑了我的答案,这在旧的Delphi上是正确的。谢谢你的反馈!如果User32.dll支持DBCS,则SM_DBCSENABLED为非零;否则,0。它正在工作,谢谢你@Arnaud。一个问题是它是否也适用于64位操作系统,还是我们需要进行更改?
getcpinfo(CP_ACP,0,CpInfo)
NotSingleByte:=CpInfo.MaxCharSize>1
。或者
TEncoding.GetEncoding(CP\u ACP).IsSingleByte
。我认为这取决于你们们所说的操作系统语言。现在还不清楚“双字节”对你们们意味着什么。Windows使用UTF-16作为其字符编码。因此,每个代码点都以2或4个字节进行编码。也不清楚你为什么需要知道(不管是什么)。你打算怎么处理这些信息?