Ostatnio zacząłem się bawić konsolą w Lazarusie.
Pierwsze, co chciałem zrobić to oczywiście możliwość wypisywania znaków diakrytycznych na standardowy output.
Zwyczajne:
Writeln('Zażółć gęślą jaźń');
Wypisuje w konsoli bliżej nieokreślone znaki, więc zaglądam na Wiki Lazarusa, a tam jest przykład (http://wiki.freepascal.org/Console_Mode_Pascal#Unicode_.28UTF8.29_output):
program uniconsole;
{$mode objfpc}{$H+}
{$APPTYPE CONSOLE}
uses
{$IFDEF UNIX}
{$IFDEF UseCThreads}
cthreads,
{$ENDIF}
{Widestring manager needed for widestring support}
cwstring,
{$ENDIF}
{$IFDEF WINDOWS}
Windows, {for setconsoleoutputcp}
{$ENDIF}
Classes
;
var
UTF8TestString: string;
begin
{$IFDEF WINDOWS}
SetConsoleOutputCP(CP_UTF8);
{$ENDIF}
UTF8TestString:= 'rosé, водка and ούζο';
writeln ('plain: ' + UTF8TestString);
{Apparently we don't need UTF8ToConsole for this
UTF8ToConsole did not do anything for me in fact.}
end.
Który po skompilowaniu wypisuje mniej-więcej coś takiego:
ros ę, -| # and #
Czyli, daleko od docelowego tekstu :/
Próbowałem nawet bezpośrednio operować na funkcjach api:
Var bw : DWord;
Str: String;
Begin
SetConsoleOutputCP(CP_UTF8);
Str := 'Zażółć gęślą jaźń';
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), @Str[1], Length(Str), bw, nil);
(oczywiście przy włączonym {$H+}
) i brak efektów :/
Macie więc jakiś pomysł, jaki wymusić wyświetlanie znaków diakrytycznych w konsoli (w Windowsie)?
Edit: jeżeli normalnie otworzę "cmd", to mogę wpisywać znaki diakrytyczne, a i również uruchamiałem programy konsolowe wypisujące je, więc nie jest to wina braku czcionek itp.