正如我们从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 Array)中,但我们需要在bLocalHost(Char数组)中得到结果
有没有像这样的副本(PAnsiChar,PChar,大小)的功能
将PAnsiChar的内容复制到PChar之类的数组,而不会由于Unicode而丢失数据,因此,如果temp_Buffer =“ some data”,则bLocalHost必须是“ some data”吗?
最佳答案
没有在不转换数据的情况下将AnsiChar
数组的内容分配给(Wide)Char
数组的功能。为此,请使用Win32 API的MultiByteToWideChar()
函数或RTL的UnicodeFromLocaleChars()
函数。
否则,您可以将您的bLocalHost
变量更改为一个AnsiChar
数组。或者,您可以将其更改为(Unicode)String
,并在直接向其分配以空值终止的(P)AnsiChar
时让RTL为您转换数据。