[fpc-devel] Console encoding on Windows, output to file with ">"

Ondrej Pokorny lazarus at kluug.net
Wed May 3 18:18:53 CEST 2017

Michael, because I cannot comment on a closed issue report I post my 
answer to https://bugs.freepascal.org/view.php?id=31746#c100091 here:

 > I don't think what you write is correct. As far as I can see in the 
code of Delphi Berlin: Delphi uses always the defaultsystemcodepage for 
text files, regardless of what the file is used for.

What do you mean? I checked both Berlin and Tokyo and in "function 
TextOpen(var t: TTextRec): Integer;" in unit System you see that if the 
text file is used for console input/output the CodePage is 
GetConsoleOutputCP/GetConsoleCP whereas if the text file is used for 
other purposes it uses DefaultSystemCodePage. (Search for "if 
GetFileType(t.Handle) = 2 then"; 2=FILE_TYPE_CHAR).

It is correct that the patch doesn't exactly reflect Delphi behavior - 
it sets the DefaultSystemCodePage only for standard output and not all 
text files. It mises the Delphi fallback to DefaultSystemCodePage.

 > FPC uses a different mechanism which allows you to write files in a 
different code page.

Exactly. The issue report is about the fact that the mechanism is 
different - which puzzled me a lot. I just didn't understand why I see 
nonsense in Notepad when I open the output from an FPC application 
whereas output from Delphi shows fine.

Some background: I convinced one of my customers that FPC is better than 
Delphi (I have known it for a long time already) and migrated one of my 
console programs for him from Delphi to FPC and I didn't understand why 
FPC "corrupts" the output to file whereas the output to console is OK. I 
wasn't aware that the FPC output was in console codepage even if you 
redirect the output to a file (you don't really use console codepage for 
files, don't you).

I accept that this behavior is by design and wanted - I hadn't found any 
information on this Delphi incompatibility before I started checking the 
issue. So at least the issue report can be some kind of information 
source even if you won't fix it - hopefully Google files it correctly :)

 > You can do your own detection and set the code page accordingly

This is exactly what I found out and what I posted as workaround in 
"Steps To Reproduce" :)


More information about the fpc-devel mailing list