将TByteDynArray转换为字符串

Ago*_*Ago 4 delphi

我正在使用Web服务,但在文本内容中发现无效字符时遇到问题。我没有太多的编码经验,所以我决定将数据传递为TByteDynArray。这是我从此答案中使用的代码。

class function StringHelper.StringToByteArray(value: string): TByteDynArray;
begin   
  SetLength(Result, Length(value) * SizeOf(Char));    
  if Length(value) > 0 then
  begin
    Move(value[1], Result[0], Length(value) * SizeOf(Char));
  end;
end;
Run Code Online (Sandbox Code Playgroud)

我成功地将转换stringTByteDynArray,但是我不知道如何将其转换TByteDynArraystring

Dav*_*nan 8

通常最好使用TEncoding类来执行此类操作,而不是复制原始UTF16字节。您可能会借此机会变得更加精通文本编码。

因此,您可以使用

bytes := TEncoding.UTF8.GetBytes(str);
Run Code Online (Sandbox Code Playgroud)

获取文本为UTF8编码的字节。

反方向使用

str := TEncoding.UTF8.GetString(bytes);
Run Code Online (Sandbox Code Playgroud)

我在这里选择了UTF8编码,但是编码选择是您的。有关TEncoding所有选项,请参阅文档。

您问题中的代码隐式获取UTF16字节,因为这是Delphi中的原始字符串编码。我怀疑您使用该编码不是出于任何特定选择。但是,如果重要的是使用UTF16,则将上面的代码更改为use TEncoding.Unicode

但是,通常,UTF8是一种不错的选择,因为它倾向于节省空间。