gpt4 book ai didi

delphi - 将空分隔的 PWideChar 转换为字符串列表

转载 作者:行者123 更新时间:2023-12-02 08:52:29 26 4
gpt4 key购买 nike

通过 Windows API 调用 ( GetUserPreferredUILanguages() ),我得到一个以 one null 分隔的 PWideChar 形式的字符串列表。我需要将其转换为 Delphi 字符串列表。我开始编写代码来手动循环列表,寻找 #0 字符。

有更聪明的方法吗?

GetUserPreferredUILanguages 返回的 PWideChar 示例:

('e','n','-','U','S',#0,'f','r','-','F','R',#0,#0,...)

(根据我在文档中读到的内容,因为当我在计算机上调用该函数时,它只返回一种语言,即 'en-US'#0#0)

这是迄今为止我的代码:

procedure GetWinLanguages(aList: TStringList);
var lCount, lSize: ULong;
lChars: array of WideChar;
lIndex, lLastIndex: integer;
begin
lSize := 1000;
SetLength(lChars, lSize);
GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, @lCount, @lChars[0], @lSize);

// untested quick solution to convert from lChars to aList
lIndex := 0;
lLastIndex := -1;
while (lIndex<=lSize) do
begin
while (lIndex<lSize) and (lChars[lIndex]<>#0) do
inc(lIndex);
if (lIndex-lLastIndex)>1 then
begin
// here: copy range lLastIndex to lIndex, convert to string and add to aList
lLastIndex := lIndex;
inc(lIndex);
end else
Break;
end;
end;
PS。我在 Windows 10 上使用 Delphi Berlin 进行 FMX 项目。

最佳答案

此 API 返回一个以 null 结尾的双字符串。这个程序展示了如何解析这样的东西:

{$APPTYPE CONSOLE}

uses
System.SysUtils,
Winapi.Windows;

procedure Main;
var
NumLanguages, LanguagesBufferLen: ULONG;
LanguagesBuffer: TArray<WideChar>;
P: PWideChar;
str: string;
begin
LanguagesBufferLen := 0;
Win32Check(GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, @NumLanguages, nil, @LanguagesBufferLen));
SetLength(LanguagesBuffer, LanguagesBufferLen);
Win32Check(GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, @NumLanguages, @LanguagesBuffer[0], @LanguagesBufferLen));
P := @LanguagesBuffer[0];
while P^<>#0 do begin
str := P;
Writeln(str);

inc(P, Length(str)+1); // step over the string, and its null terminator
end;
end;

begin
try
Main;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.

如何从这段代码中提取一个函数来将空终止字符串解析为字符串列表应该是显而易见的。这将允许您在其他地方重复使用该代码。

关于delphi - 将空分隔的 PWideChar 转换为字符串列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43183306/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com