2015-10-20 3 views
0

Как я могу выделить строку UTF8 в стеке/куче? Вот пример, который использует статический массив для его распределения. Однако массив заполнен "?" в отладчике. Нужно ли мне также учитывать кодовую страницу при распределении?Как выделить строку 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

Рассмотрите использование 'WideChar' – fantaghirocco

+1

Это действительно помогло бы иметь больше контекста здесь. В реальном случае, что вы собираетесь делать с кодированными байтами UTF-8? Почему вы не можете использовать «TEncoding.UTF8.GetBytes»? Почему имеет значение, живут ли байты в стеке или куче? Я уверен, что у вас есть причины, но это поможет нам узнать больше о вашем мышлении. –

+0

@DavidHeffernan Я стараюсь избегать кучи как можно больше. – user15124

ответ

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 закодирован.

Вы уже знаете, как выделить память в куче, поэтому мне не нужно это объяснять.

+0

Почему UTF8String показывает правильный контент? – user15124

+0

Да, получается, что компилятор может быть убежден в константы кодирования UTF-8 –

+0

Вы также можете использовать его :) – user15124