我知道这可能很简单,但有时候因为太多的考虑因素,Unicode问题会给我带来太大麻烦。
我有这段代码:
pcBuffer := StrAlloc(Stream.Size + 1) where pcBuffer is defined as PWideChar
该组件现在需要pcBuffer as PAnsiChar
,所以如果我这样做,我会收到错误
StrAlloc-不兼容的类型PAnsiChar和PWideChar
因为StrAlloc返回PWideChar
我该如何解决这个问题?
我可以简单地以Unicode方式或通过GetMem键入强制转换为PAnsiChar or alloacate
吗?
答案 0 :(得分:3)
在Delphi XE中,SysUtils
单元定义了以下功能:
function AnsiStrAlloc(Size: Cardinal): PAnsiChar;
function WideStrAlloc(Size: Cardinal): PWideChar;
function StrAlloc(Size: Cardinal): PChar;
您应该致电AnsiStrAlloc
分配PAnsiChar
。这会收到以字符为单位的Size
。您必须考虑空终止符。
var
pcBuffer: PAnsiChar;
....
pcBuffer := AnsiStrAlloc(Stream.Size + 1);
但是,这些功能应该被视为已弃用。它们在Delphi的更高版本中被记录。相反,您应该使用AnsiString
,因此让编译器管理生命周期和内存分配。
var
str: AnsiString;
pcBuffer: PAnsiChar;
....
SetLength(str, Stream.Size);
pcBuffer := PAnsiChar(str);
缓冲区的生命周期由编译器管理,就像任何Delphi字符串变量一样。
上面的代码很可能不是解决实际问题的最佳方法。没有看到更多细节,很难确定最佳解决方案是什么。我唯一有信心的是StrAlloc
和朋友不是前进的方式。
答案 1 :(得分:2)
您正在StrAlloc()
单位拨打SysUtils
,该单位会分配PWideChar
。
要分配PAnsiChar
,请从StrAlloc()
单元拨打AnsiStrings
:
uses
..., AnsiStrings;
pcBuffer := AnsiStrings.StrAlloc(Stream.Size + 1);