On 10/20/06, Vincent Snijders <[EMAIL PROTECTED]> wrote:
This should be
   WideText := GetMem(Size*2);
because you get the number of characters, and the number of bytes 2* number of
characters.

Thanks, it works, but I still have doubts.

1) On linux I will need that cwstring unit, right? This was a utf-8
test to be used on fpGUI, and possibly LCL. So can´t we just add
cwstring on another unit instead of the first of the program?

2) Does this work in case my string contains characters bigger then
#FFFF ? I mean, it seams that we suppose that each character will have
2 bytes, but this may not be true.

3) Shouldn´t we allocate Size * 2 + 2? I mean, we did not allocate
space for the null-terminator.

4) Here is this function on action:

procedure TGDICanvas.DoTextOut(const APosition: TPoint; const AText: String);
var
 UnicodeEnabledOS: Boolean;
 WideText: PWideChar;
 AnsiText: string;
 Size: Integer;
begin
 UnicodeEnabledOS := True;

 NeedFont(True);

 if UnicodeEnabledOS then
 begin
   Size := Utf8ToUnicode(nil, PChar(AText), 0);
   WideText := GetMem(Size * 2);
   Utf8ToUnicode(WideText, PChar(AText), Size);
   dynWindows.TextOutW(Handle, APosition.x, APosition.y, WideText, Size - 1);
   FreeMem(WideText);
 end
 else
 begin
   AnsiText := Utf8ToAnsi(AText);
   Windows.TextOut(Handle, APosition.x, APosition.y, PChar(AnsiText),
Length(AnsiText));
 end;
end;

Notice the Size - 1 on the TextOutW call. If I use Size instead of
Size -1 it will display a wrong character as the last of my string.
Even if I clean the string filling it with zeroes before I pass it to
the conversion unit. Why is that? Size already counts the
null-terminator?

Umm, I think that Utf8ToUnicode needs to be documented. Even some
comments on the code would help, currently there are no comments at
all.

5) When I try to convert strings that contain Line-Endings it doesn´t
seam to work. What happens to Line-Ending marks on UTF-16? I mean, if
we are on linux, a utf-16 line ending marker cannot have just 1 byte,
can it?

If I convert a string with a line ending and pass that to ExtTextOutW,
a wrong character will appear on the place of the line-ending marker.

thanks,
--
Felipe Monteiro de Carvalho
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to