gpt4 book ai didi

delphi - 将ansichar数组复制到char数组delphi 10.2

转载 作者:行者123 更新时间:2023-12-03 15:31:49 25 4
gpt4 key购买 nike

据我们所知,Delphi 2007 及以下版本中的字符串不是 Unicode

字符为1字节

AnsiChar 1 字节

从 Delphi 2009 及以上版本开始,字符串是 Unicode

字符为2字节

AnsiChar 1 字节

当我将 Delphi 代码从 Delphi6 转换为 Delphi 10.2(unicode 字符串)时我遇到一些函数使用 PAnsiChar 来填充 Char 数组的问题,但传递的指针是 PChar,在非 Unicode Delphi 中我不会得到任何错误

但我在新的 Delphi 中会收到错误示例

procedure TswSocket.SetLocalHost(AHost : AnsiString);
var
HostIpAddress : TIPAddress;
Buffer: PChar;

begin
Buffer:=StrAlloc(Length(AHost)+1);
strpcopy(Buffer,AHost);
Buffer[Length(AHost)]:=#0;
bLocalHost:=StrAlloc(MAXGETHOSTSTRUCT);
hGetLocalHost:=WSAAsyncGetHostByName(Self.hWindow,WM_SOCKETGETHOSTBYNAME,Buffer,bLocalHost,MAXGETHOSTSTRUCT); // Buffer,bLocalHost must be PAnsiChar instead of PChar

WSAAsyncGetHostByName 将填充 bLocalHost

修复我使用的错误

procedure TswSocket.SetLocalHost(AHost : AnsiString);
var
HostIpAddress : TIPAddress;
Buffer,temp_Buffer : PAnsiChar;

begin
Buffer:=AnsiStrAlloc(Length(AHost)+1);
strpcopy(Buffer,AHost);
Buffer[Length(AHost)]:=#0;

temp_Buffer:=AnsiStrAlloc(MAXGETHOSTSTRUCT);
bLocalHost:=StrAlloc(MAXGETHOSTSTRUCT);
hGetLocalHost:=WSAAsyncGetHostByName(Self.hWindow,WM_SOCKETGETHOSTBYNAME,Buffer,temp_Buffer,MAXGETHOSTSTRUCT); // no error : Buffer,temp_Buffer is PAnsiChar

现在结果在 temp_Buffer(AnsiChar 数组)中,但我们需要 bLocalHost(Char 数组)中的结果

有没有像这个copy(PAnsiChar,PChar,size)这样的函数 将 PAnsiChar 的内容复制到类似 PChar 的数组,而不会因 Unicode 而丢失数据,因此如果 temp_Buffer ='some data' 那么 bLocalHost 必须 ='some data' ?

最佳答案

没有函数可以将 AnsiChar 数组的内容分配给 (Wide)Char 数组而不转换数据。使用 Win32 API 的 MultiByteToWideChar()函数,或 RTL 的 UnicodeFromLocaleChars()函数,用于此目的。

否则,您可以将 bLocalHost 变量更改为 AnsiChar 数组。或者,您可以将其更改为 (Unicode)String,并在直接向其分配以 null 结尾的 (P)AnsiChar 时让 RTL 为您转换数据。

关于delphi - 将ansichar数组复制到char数组delphi 10.2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55357945/

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