[Lazarus] Removed use of UTF8String in Lazarus to work with cpstrnew

Luiz Americo Pereira Camara luizmed at oi.com.br
Mon Sep 19 18:31:15 CEST 2011


On 19/9/2011 08:19, Paul Ishenin wrote:
> 19.09.2011 20:05, Hans-Peter Diettrich wrote:
>> IMO the use of RawByteString will not help much, except for 
>> (possibly) simpler code and less overloaded procedures. Avoiding 
>> implicit conversions instead will require *fixed* string types and 
>> encodings, for different tasks with different needs. E.g. a TFileName 
>> string type will allow to eliminate all conversions, when a string is 
>> known to hold file or path names (by design). Likewise an LCLString 
>> (widget, component) type could do the same for the LCL widgetset 
>> interface. The FPC decisions about string container classes 
>> (TStrings...) will tell where to put the break line, between user and 
>> widget string types.
>
> My statement about RawByteString need to be read in the context of 
> code where I replaced UTF8String to AnsiString.

Just to point that RawByteString should be used in very specific cases 
like stated in the link below

http://stackoverflow.com/questions/498315/delphi-2009-rawbytestring-vagaries

Regarding change to UTF8ToUTF16 function RawByteString should not be used.

function UTF8ToUTF16(const S: UTF8String): UTF16String;

Currently does not matter if is UTF8String or AnsiString, but when the 
new string type starts to be used, there's no problem using UTF8String.

In fact the use of UTF8String will be necessary otherwise explicit 
conversions with extra hidden temporary variables inside the function 
will be necessary as is the case with RawByteString.

Also PChar should be changed to PAnsiChar since PChar can point to a 
word (UTF16 RTL) or a byte (UTF8 RTL)

I explained in a mail in the devel list (where you see UnicodeString 
read as UTF8String)

> I'm talking about:
>
> function FileGetAttr(const FileName: UnicodeString): Longint;
> begin
>   Result:=Integer(Windows.GetFileAttributesW(PWideChar(FileName)));
> end;
>
>
> Inside the procedure there will be no conversion since is already 
> UTF16, just a typecast to PWideChar which in fact is a function
>
> The conversion will be done before the function call  only if 
> necessary (eg UTF8 -> UTF16). The decision to convert or not is done 
> at compiler time.
>
>
> With RawByteString
>
> function FileGetAttr(const FileName: RawByteString): Longint;
> begin
>   
> Result:=Integer(Windows.GetFileAttributesW(PWideChar(UnicodeString(FileName))));
> end;
>
>
> Here the decision to convert or not is done at runtime by checking the 
> CodePage of FileName. Also there's one more temp variable due to 
> UnicodeString typecast.
>
> In summary:
> With UnicodeString decision to convert at design time
> With RawByteString decision to convert at run time + one more temp 
> variable


Luiz




More information about the Lazarus mailing list