正如我们在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”?
答案 0 :(得分:2)
没有将AnsiChar
数组的内容分配给(Wide)Char
数组而不转换数据的功能。为此,请使用Win32 API的MultiByteToWideChar()
函数或RTL的UnicodeFromLocaleChars()
函数。
否则,您可以将bLocalHost
变量更改为AnsiChar
数组。或者,您可以将其更改为(Unicode)String
,并在RTL直接为它分配空终止的(P)AnsiChar
时让RTL为您转换数据。