如何在堆栈/堆上分配UTF8字符串?

时间:2015-10-20 07:42:02

标签: delphi delphi-xe8

如何在堆栈/堆上分配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.

1 个答案:

答案 0 :(得分:1)

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

这可能是这样的:

procedure Main;
const
  utf8string: PAnsiChar =
    #$E6#$BC#$A2#$E8#$AA#$9E#$E6#$BC#$A2#$E8#$AA#$9E +
    #$E6#$BC#$A2#$E8#$AA#$9E#$E6#$BC#$A2#$E8#$AA#$9E +
    #$00;
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编码,您的数组对于文本来说太短了。

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