如何在stack/heap上分配一个UTF8字符串?

How to allocate a UTF8 string on the stack/heap?

如何在 stack/heap 上分配 UTF8 字符串?这是一个使用静态数组分配它的示例。但是数组中充满了“?”在调试器中。分配时是否还需要考虑代码页?

program Project1;

procedure Main;
var
  Stack: Array[0..20] of AnsiChar;
  Heap: PAnsiChar;
begin
  Stack := '漢語漢語漢語漢語';

  GetMem(Heap, 8 * SizeOf(AnsiChar));
  Move(PAnsiChar('漢語漢語漢語漢語')^, Heap^, 8 * SizeOf(AnsiChar));
end;

begin
  Main;
end.

另一方面,这工作正常。

program Project1;

procedure Main;
var
  S: UTF8String;
begin
  S := '漢語漢語漢語漢語';
end;

begin
  Main;
end.

您无法说服编译器生成 UTF-8 编码常量。它将提供 ANSI 或 UTF-16,但不提供 UTF-8。您必须自己处理编码。

可能看起来像这样:

procedure Main;
const
  utf8string: PAnsiChar =
    #$E6#$BC#$A2#$E8#$AA#E#$E6#$BC#$A2#$E8#$AA#E +
    #$E6#$BC#$A2#$E8#$AA#E#$E6#$BC#$A2#$E8#$AA#E +
    #[=10=];
var
  Stack: array [0..24] of AnsiChar;
begin
  Move(Pointer(utf8string)^, Stack, SizeOf(Stack));
end;

其实,事实证明我错了。您可以说服编译器对常量进行 UTF-8 编码。像这样:

procedure Main;
const
  utf8str: UTF8String = '漢語漢語漢語漢語';
var
  Stack: array [0..24] of AnsiChar;
begin
  Assert(Length(utf8str) + 1 = Length(Stack));
  Move(Pointer(utf8str)^, Stack, SizeOf(Stack));
end;

请注意,在对文本进行 UTF-8 编码后,您的数组对于文本来说太短了。

你已经知道如何在堆上分配内存,所以我不需要解释。