Autor Beitrag
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Moderator
Beiträge: 3655
Erhaltene Danke: 594

Win XP x86, Win 8.1 x64
Lazarus Snapshot; Delphi 7,2007,XE; PHP (PHPEdit,PhpStorm); JS; Java(Eclipse)
BeitragVerfasst: Mi 07.07.10 03:42 
Wer öfter mal {$APPTYPE CONSOLE} nutzt, und seine Konsole dabei auf der Standard-Rasterschriftart stehen hat, kennt bestimmt das Problem: Sonderzeichen, besonders Umlaute, gehen kaputt.

Schuld ist hier, dass Delphi Strings in ANSI-Zeichen ausgibt, die Console aber OEM (Codepage 850) will.

Diese Unit erspart einem das händische Umwandeln jeder Ausgabe, indem die Ausgabefunktionen so umgelenkt werden, dass jeder Buffer automatisch konvertiert wird.


Bugreports etc sind gern gesehen, auch wenn ich nicht glaube, dass in 104LOC so viele drin sein können :zwinker:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
begin
  Writeln('Hänschen ist müde');
  InstallOEMConsole;
  Writeln('Hänschen ist müde');
  UnInstallOEMConsole;
  Writeln('Hänschen ist müde');
  Readln;
end.

Ausgabe:
ausblenden Quelltext
1:
2:
3:
Hõnschen ist m³de
Hänschen ist müde
Hõnschen ist m³de
Einloggen, um Attachments anzusehen!
_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."


Zuletzt bearbeitet von Martok am Do 08.07.10 03:10, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18717
Erhaltene Danke: 1624

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 07.07.10 05:38 
Kleine Korrektur:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure DoWork(var F: TTextRec);
begin
  CharToOemBuffA(F.BufPtr,F.BufPtr, F.BufPos);
end;
Sonst funktioniert es mit Delphi 2010 z.B. nicht. ;-)
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mi 07.07.10 09:55 
Man muss aber beachten, dass, wenn man den Output in ein File umleitet, die Textdatei dann auch 850 codiert ist. -> Lösungsansatz: Liefert GetConsoleMode false zurück, dann soll InstallOEMConsole nichts ändern, da in ein File geschrieben wird.

Alternativ hätte man WriteConsole(W) (mit GetStdHandle(STD_OUTPUT_HANDLE)) verwenden können (Unicode support). WriteConsole unterstützt das Schreiben in ein File nicht. Da müsste man dann doch wieder eine Fallunterscheidung machen.


Zuletzt bearbeitet von delfiphan am Mi 07.07.10 16:14, insgesamt 1-mal bearbeitet
Gammatester
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 328
Erhaltene Danke: 101



BeitragVerfasst: Mi 07.07.10 12:30 
Funktioniert so erst ab Delphi6.

Ein sinnvoller Zusatz: Es wird nicht verhindert, daß man zweimal InstallOEMConsole aufruft und man sich so die geretteten Originalfunktionen zerschießt. Abhilfe mit globaler Variable OEMConsoleInstalled: boolean oder Test, ob Oldfunc bereits die neuen Funktionen enthält.
Martok Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Moderator
Beiträge: 3655
Erhaltene Danke: 594

Win XP x86, Win 8.1 x64
Lazarus Snapshot; Delphi 7,2007,XE; PHP (PHPEdit,PhpStorm); JS; Java(Eclipse)
BeitragVerfasst: Do 08.07.10 00:01 
user profile iconGammatester hat folgendes geschrieben Zum zitierten Posting springen:
Funktioniert so erst ab Delphi6.

Warum dieses?
Ich hab D7, bin aber der Meinung dass das in D4 nicht viel anders implementiert wäre.

Danke für die Hinweise, werde ich einbeziehen.

user profile icondelfiphan hat folgendes geschrieben Zum zitierten Posting springen:
Alternativ hätte man WriteConsole(W) (mit GetStdHandle(STD_OUTPUT_HANDLE)) verwenden können (Unicode support).

Stimmt, wäre eventuell sogar sinnvoller, in Zeiten, wo es auch Delphis gibt die Unicode können.
Ich wollte aber die Write()-Compiler-Magic nicht verlieren, daher diese Variante.

EDIT: und fertig, neue Version oben mit euren Hinweisen.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."