【发布时间】:2015-03-07 14:12:31
【问题描述】:
我有一个 DLL 函数,它返回一个指向 ANSI 文本 (PAnsiChar) 的指针。我想将其分配给(unicode-)字符串(这是Delphi XE2。)。以下编译但我收到警告 “W1057 隐式字符串从 'AnsiChar' 转换为 'string'”:
function TProj4.pj_strerrno(_ErrorCode: Integer): string;
var
Err: PAnsiChar;
begin
Err := Fpj_strerrno(_ErrorCode);
Result := Err;
end;
编辑:有问题的文本是英文的错误消息,所以这里不太可能有任何转换问题。
我现在很想将 Err 显式类型转换为这样的字符串 ...
Result := String(Err);
.. 摆脱警告。这会出错吗?我应该改用临时 AnsiString 变量吗?
var
s: AnsiString;
[...]
s := Err;
Result := String(s);
如果是,为什么?
或者我应该明确表示,代码首先将 PAnsiChar 转换为 AnsiString,然后将 AnsiString 转换为 String?
Result := String(AnsiString(Err));
当然我可以把它变成一个函数:
function PAnsicharToString(_a: PAnsiChar): string;
begin
// one of the above conversion codes goes here
end;
所有这些选项都可以编译,但它们会起作用吗?这里的最佳做法是什么?
加分项:理想情况下,代码应该能够在 Delphi 2007 和更新版本中编译和工作。
【问题讨论】:
-
您需要知道用于对 8 位文本进行编码的代码页。除非你知道你不能指望取得进步。
-
本案例中的文字是英文的错误信息,所以不太可能引起任何问题。
-
那么,文本是如何编码的呢?哪个代码页?你知道吗?如果您对“不太可能”感到满意,那您为什么想了解最佳实践?
-
我猜@dummzeuch 试图说文本是纯 ASCII,因此不太可能包含任何不可转换的项目,无论代码页如何。但我们都知道土耳其语 EBCDIC (CP 1026) 与 ASCII-7 不兼容。
标签: delphi unicode delphi-xe2 delphi-2007 pchar