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

时间:2019-03-26 13:06:33

标签: delphi unicode char-pointer

正如我们在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数组)中

是否有类似此副本的功能(PAnsiChar,PChar,大小)  将PAnsiChar的内容复制到PChar之类的数组,而不会由于Unicode而丢失数据,因此,如果temp_Buffer =“ some data”,则bLocalHost必须是“ some data”?

1 个答案:

答案 0 :(得分:2)

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

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