将PAnsiChar分配给(unicode-)字符串的正确方法是什么?

dum*_*uch 0 delphi unicode delphi-2007 pchar delphi-xe2

我有一个DLL函数,返回一个指向ANSI文本(PAnsiChar)的指针.我想将它分配给(unicode-)字符串(这是Delphi XE2.).以下编译,但我得到一个警告"W1057隐式字符串从'AnsiChar'转换为'字符串'":

function TProj4.pj_strerrno(_ErrorCode: Integer): string;
var
  Err: PAnsiChar;
begin
  Err := Fpj_strerrno(_ErrorCode);
  Result := Err;
end;
Run Code Online (Sandbox Code Playgroud)

编辑:有问题的文本是英文错误信息,因此这里不太可能有任何转换问题.

我现在很想明确地将Err明确强制转换成这样的字符串......

Result := String(Err);
Run Code Online (Sandbox Code Playgroud)

..摆脱警告.这可能会出错吗?我宁愿使用临时的AnsiString变量吗?

var
  s: AnsiString;
[...]
s := Err;
Result := String(s);
Run Code Online (Sandbox Code Playgroud)

如果是,为什么?

或者我应该明确说明,代码首先将PAnsiChar转换为AnsiString,然后将AnsiString转换为String?

Result := String(AnsiString(Err));
Run Code Online (Sandbox Code Playgroud)

当然,我可以使它成为一个功能:

function PAnsicharToString(_a: PAnsiChar): string;
begin
   // one of the above conversion codes goes here
end;
Run Code Online (Sandbox Code Playgroud)

所有这些选项都可以编译,但它们会起作用吗 这里最好的做法是什么?

加分:理想情况下,代码应该与Delphi 2007和更新版本一起编译和使用.

Dav*_*nan 5

如果文本是在用户当前区域设置中编码的,那么我会说它最简单:

var
  p: PAnsiChar;
  str: string;
....
str := string(p);
Run Code Online (Sandbox Code Playgroud)

否则,如果您希望从特定代码页转换为Unicode字符串,那么您将使用UnicodeFromLocaleChars.

  • 嗯,是的.我不知道代码页,因为dll上没有太多文档.我假设Windows-1252,因为这是那些不关心Unicode的人最常使用的.所以,我可能只是按照你的建议使用一个类型转换. (2认同)
  • 这听起来不对.类型转换将使用当前代码页,该代码页可能不是1252.并且库在固定代码页中为您提供文本是不常见的.更可能是文本是ASCII或在当前代码页中编码.无论哪种方式,简单的演员都可以.我的猜测是,如果库没有说明代码页,那么文本将在当前代码页中进行编码. (2认同)