如何在堆栈/堆上分配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.
答案 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编码,您的数组对于文本来说太短了。
你已经知道如何在堆上分配内存,所以我不需要解释它。