[fpc-devel] TEncoding.Default and default encoding for TStrings.LoadFrom*()

Ondrej Pokorny lazarus at kluug.net
Fri Dec 27 02:20:56 CET 2019

On 26.12.2019 23:42, Marco van de Voort wrote:
> Op 12/26/2019 om 9:12 PM schreef Ondrej Pokorny:
>> In Delphi TEncoding.ANSI and TEncoding.Default are actually 
>> different. See:
>> http://docwiki.embarcadero.com/Libraries/Rio/en/System.SysUtils.TEncoding.Default 
>> http://docwiki.embarcadero.com/Libraries/Rio/en/System.SysUtils.TEncoding.ANSI 
>> On Windows, they are equal but on POSIX they are different: 
>> TEncoding.Default is UTF-8 but TEncoding.ANSI is the code page from 
>> CFLocaleGetIdentifier.
> And in FPC it is exactly the same,

No, it is not. In FPC:
class function TEncoding.GetDefault: TEncoding;
   Result := GetANSI;

For the meaning of TEncoding.Default and TEncoding.ANSI in Delphi see 
the docs above.

> BUT Lazarus overrides default with UTF8 on Windows.

Yes, it does it since r61976 - so only recently. And it is a very 
questionable commit because
a) is not Delphi compatible
b) breaks OS-ANSI calls
c) breaks ANSI FPC code

It must either be reverted or we need some high-level method to get the 
OS-ANSI codepage without this override.

> As you can see that is NOT compatible with Delphi above.
Yes, and I am against r61976 - but because r61976 overrides 
TEncoding.ANSI to UTF-8 on Windows. IMO TEncoding.Default should be 
UTF-8 in Lazarus even on Windows (whereas TEncoding.ANSI should stay 
OS-ANSI) - I try to explain again why this actually fits very well into 
the Delphi/FPC encoding concept. I will now talk only about Windows for 
simplicity (because the ANSI concept is most important on Windows):

Delphi doesn't know the DefaultSystemEncoding concept that FPC has. The 
default AnsiString encoding in Delphi is always OS-ANSI (CP_ACP). 
Therefore it makes perfect sense to have TEncoding.Default to point to 
the default AnsiString encoding that is OS-ANSI encoding in Delphi.

FPC, on the contrary, overrides the CP_ACP value with 
DefaultSystemEncoding. So the default AnsiString encoding is not OS-ANSI 
but DefaultSystemEncoding. Therefore, again, it makes perfect sense to 
have TEncoding.Default to point to the default AnsiString encoding that 
is DefaultSystemEncoding in FPC.


More information about the fpc-devel mailing list