[fpc-pascal] More help with unicode

Felipe Monteiro de Carvalho felipemonteiro.carvalho at gmail.com
Sat Nov 10 16:41:39 CET 2007


On Nov 10, 2007 4:30 PM, Jonas Maebe <jonas.maebe at elis.ugent.be> wrote:
> You're making the same error which Marco pointed out earlier:
> Utf8Decode returns a (reference counted) widestring, but you are not
> assigning it to anything so it ends up in a (reusable) temp location.
> As soon as the next temporary widestring has to be created, the
> previous one is destroyed and the pwidechar will point to a random
> memory block.

Ummm, but there is nothing else on that function, so I don't see how
can the temporary string be destroyed before I call SETTEXT, unless
SETTEXT expects that I give it a storage that is at all times
available...

procedure TWin32MemoStrings.SetText(TheText: PChar);
begin
    SendMessage(fHandle, WM_SETTEXT, 0, LPARAM(TheText));
end;

Which I currently converted into (but still doesn't work):

procedure TWin32MemoStrings.SetText(TheText: PChar);
var
  AnsiBuffer: ansistring;
  WideBuffer: widestring;
begin
  {$ifdef WindowsUnicodeSupport}
    if UnicodeEnabledOS then
    begin
      WideBuffer := Utf8Decode(TheText);
      SendMessage(fHandle, WM_SETTEXT, 0, LPARAM(PWideChar(WideBuffer)));
    end
    else
    begin
      AnsiBuffer := Utf8ToAnsi(TheText);
      SendMessage(fHandle, WM_SETTEXT, 0, LPARAM(PChar(AnsiBuffer)));
    end;
  {$else}
    SendMessage(fHandle, WM_SETTEXT, 0, LPARAM(TheText));
  {$endif}
end;

Alternatively I moved AnsiBuffer and WideBuffer to the class
declaration, so they are always available, which also didn't solve the
problem of showing wrong characters.

It shows the string ééé as if it was Ã(c)Ã(c)Ã(c)

Which is what I would expect if I use ansi routines to show a utf-8 string.

thanks,
-- 
Felipe Monteiro de Carvalho



More information about the fpc-pascal mailing list