将 ansichar 数组复制到 char 数组 delphi 10.2
copy array of ansichar to array of char delphi 10.2
正如我们从 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()
function, or the RTL's UnicodeFromLocaleChars()
函数。
否则,您可以将 bLocalHost
变量更改为 AnsiChar
数组。或者,您可以将其更改为 (Unicode)String
并让 RTL 在直接向其分配空终止 (P)AnsiChar
时为您转换数据。
正如我们从 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()
function, or the RTL's UnicodeFromLocaleChars()
函数。
否则,您可以将 bLocalHost
变量更改为 AnsiChar
数组。或者,您可以将其更改为 (Unicode)String
并让 RTL 在直接向其分配空终止 (P)AnsiChar
时为您转换数据。