如何在delphi中获得双字节操作系统语言?
我想检测操作系统的语言是否为双字节。 要获取语言,我正在使用windows的GetLocaleInfo函数。但我想检测语言是否为双字节。我可以通过取语言的名称来确定它是双字节还是非双字节(即,如果语言是日语,那么它的双字节),但是否有其他方法可以直接获取操作系统的双字节语言 我用于获取语言的代码:如何在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
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个字节进行编码。也不清楚你为什么需要知道(不管是什么)。你打算怎么处理这些信息?