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

时间:2014-12-01 10:28:56

标签: 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;

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

你的想法好吗?

2 个答案:

答案 0 :(得分:6)

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

function ArrayToString(const a: VarStr): string;
begin
  SetString(Result, PWideChar(a), Length(a));
end;

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

{$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.

输出结果为:

ab
abcd

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

也许当你说:

  

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

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

答案 1 :(得分:1)

Result:= Trim(string(a));

更新:正如同事们在评论中慷慨地指出,这是一个错误的答案!它的工作原理只是因为内部字符串和动态数组实现非常相似,并且无法保证这些代码在将来的编译器版本中可以正常工作。 David答案中描述了DynArray-> String转换的正确方法。我不会删除我保留评论的答案,在我看来他们的价值要大得多。