将TByteDynArray转换为字符串

5

我正在处理 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;

我成功地将 string 转换为 TByteDynArray,但我不知道如何将其从 TByteDynArray 转换回 string

1个回答

8
相比直接复制原始的UTF16字节,一般更好的选择是使用TEncoding类来执行此类操作。而且您可以借此机会提高一下文本编码的熟练程度。
因此,您可以使用:
bytes := TEncoding.UTF8.GetBytes(str);

获取UTF8编码字节的文本。

如果是相反的方向,请使用

str := TEncoding.UTF8.GetString(bytes);

我选择了UTF8编码,但是编码的选择取决于你。有关所有选项,请参阅TEncoding的文档。

你问题中的代码隐式地获取UTF16字节,因为这是Delphi中的原始字符串编码。我怀疑你之所以使用该编码并非出于特定的选择。但是,如果重要的是要使用UTF16,请将上面的代码更改为使用TEncoding.Unicode

通常情况下,然而,UTF8是一个不错的选择,因为它倾向于在空间上更加高效。


我现在使用TBytes而不是TByteDynArray。谢谢..已经全面测试并且运行良好。 - Ago
@Ago:最近(我认为是在版本10.3中),TByteDynArray已经与TBytes或TArray<Byte>同名,而TBytes通常是现在用于动态字节数组的正确类型。 - Rudy Velthuis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接