Delphi XE3:将WideChar数组转换为Unicode字符串HOWTO?

Ste*_*fan 1 delphi delphi-xe3

我在这里做了一些关于上面给出的问题的研究并得出以下代码:

VarStr = array of WideChar;

function ArrayToString(const a: VarStr): UnicodeString;
begin
  if Length(a) > 0 then
    begin
      ShowMessage ('Länge des übergebenen Strings: ' + IntToStr(Length(a)));
      SetString(Result, PWideChar(@a[0]), Length(a) div 2)
    end
  else
    Result := '';
end;
Run Code Online (Sandbox Code Playgroud)

ShowMessage在给定数组中显示正确的字符数,但该函数的结果始终为空字符串.

你的想法好吗?

Dav*_*nan 6

您传递的是错误的长度值.你只要求一半的角色.像这样修复你的代码:

function ArrayToString(const a: VarStr): string;
begin
  SetString(Result, PWideChar(a), Length(a));
end;
Run Code Online (Sandbox Code Playgroud)

但是,您还报告您的函数返回一个空字符串.最可能的原因是您将无效输入传递给函数.考虑这个程序:

{$APPTYPE CONSOLE}

type
  VarStr = array of WideChar;

function ArrayToStringBroken(const a: VarStr): UnicodeString;
begin
  SetString(Result, PWideChar(@a[0]), Length(a) div 2);
end;

function ArrayToStringSetString(const a: VarStr): UnicodeString;
begin
  SetString(Result, PWideChar(a), Length(a));
end;

var
  a: VarStr;

begin
  a := VarStr.Create('a', 'b', 'c', 'd');
  Writeln(ArrayToStringBroken(a));
  Writeln(ArrayToStringSetString(a));
end.
Run Code Online (Sandbox Code Playgroud)

输出是:

ab
abcd

因此,除了问题中代码的问题之外,您似乎也遇到了问题中不存在的代码问题.

也许当你说:

函数的结果始终为空字符串.

实际上,当您将返回的值传递给时,不会显示任何文本ShowMessage.这完全是另一回事.正如@bummi在注释中指出的那样,ShowMessage将在遇到的第一个空终止符处截断其输入.使用适当的调试工具来检查变量的内容.