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