[fpc-devel] Unicode support in RTL - Roadmap

Michael Schnell mschnell at lumino.de
Mon Nov 24 12:56:44 CET 2008


> Your comments are absolutely vague and meaningless. 

Sorry, but this was discussed already several times, so I supposed that 
the problems I see are known to the discussion members:

But here a simple example Lazarus project with all options left in 
standard setting:

procedure TForm1.Button1Click(Sender: TObject);
var
 sAnsiString: AnsiString;
 sUTF8String: UTF8String;
 sWideString: WideString;
begin
 sAnsiString:='üu';
 sUTF8String:='üu';
 sWideString:='üu';
 Memo1.Lines.Add('1) ' + IntToHex(integer(sAnsiString[1]), 
sizeof(char)*2) + ' ' +
                         IntToHex(integer(sAnsiString[2]), sizeof(char)*2) +
                         ' should be FC 75');
 Memo1.Lines.Add('2) ' + IntToHex(integer(sUTF8String[1]), 
sizeof(char)*2) + ' ' +
                         IntToHex(integer(sUTF8String[2]), sizeof(char)*2) +
                         ' should be C3 BC');
 Memo1.Lines.Add('3) ' + IntToHex(integer(sWideString[1]), 
sizeof(WideChar)*2) + ' ' +
                         IntToHex(integer(sWideString[2]), 
sizeof(WideChar)*2) +
                         ' should be 00FC 0075');
end;

This results in

1) C3 BC should be FC 75
2) C3 BC should be C3 BC
3) 00C3 00BC should be 00FC 0075



You don't need to tell me why the result is as it is, I do know the 
details, but for me this really is "not at all desirable", as any 
newcomer will get hit by this as soon as he tries to do any string handling.

Comment:

1) The type is named ANSIString and so anybody will suppose it in fact 
holds data of this type (ANSI code according to the system's locale) - 
unless you do something else with it in your user program, but obviously 
it does not (with German locale on Windows the ANSI code of ü is $FC ).

2) This in fact is as expected, provided you know that UTF8Strings are 
counted in code-elements rather than in code-points (aka Unicode 
Characters). But I feel that anybody who does not explicitly uses 
Unicode will assume character (notwithstanding that an utf8character is 
not defined in FPC). But you legally can claim that anybody who really 
wants to do Unicode should make himself comfortable with the details of 
UTF8.

3) Assigning a string constant to a WideString does not work as 
expected. The result is not a legal UTF16 representing the constant the 
user wrote.
 

> Not to mention
> thay also don't propose an alternative.
>   
In these discussions I provided a lot of suggestions (that might or 
might not be sensible) but of course the executive teams (FPC and 
Lazarus) themselves need to decide what to do. (The FPC team seem to 
intend to introduce strings that dynamically know the coding it contains.)
> Sorry to be blunt, but so were your comments.
>   
Sorry if I sounded blunt. I'm very happy and thankful that there are 
volunteers who dedicate their spare time to make things like FPC and 
Lazarus happen. My ranting was meant to help them improve Lazarus and 
FPC usability.

While the previous Lazarus version's string handling worked as expected 
with ANSIString, the new version forces utf8 coding onto the user, even 
if he is perfectly happy with the locale-depending ANSI he is used to. 
IMHO this only is harmful (shooing away potential users), as it in 
standard situation it does not work exactly as the old ANSIString handling.

-Michael






More information about the fpc-devel mailing list