Probleme mit Grafischen Zeichen in der Windows Console

Blocktronic
Beiträge: 7
Registriert: Di 21. Jan 2014, 15:07

Probleme mit Grafischen Zeichen in der Windows Console

Beitrag von Blocktronic »

Hallo ihr lieben,
ich wende mich an euch weil ich nach unzähligen Versuchen, Google-Recherchen und mittlerweile sehr großer Verzweiflung nicht mehr weiter weiß.
Es ist immer das gleiche lästige Ding mit der Windows-Console. Sie lässt mich in Free Pascal keine grafischen Zeichen anzeigen.

Interessanterweise kann ich die grafischen Zeichen aber direkt über die Console per Tastendruck ( z.B. ALT+177[Zehnerblock] usw. ) eingeben.
Und siehe da sie werden mir auch angezeigt. Der unten stehende FP-Code gibt mir jedoch nur das aus was man in dem Bild sehen kann,
während ich einen Pendant dazu in YABasic geschrieben mir alles korrekt ausgibt. EVTL. Wissensert ich arbeite auf einem Win7 Pro 64 Bit System

Ich erinnere mich noch an damalige Zeiten als Turbo-Pascal 7.0 unter DOS meine wünsche erfüllte war dies alles kein Problem,
grafische Fenster in der Konsole oder Spiele wie Dwarf-Fortress machen auch (unter Windows) von diesen Grafischen Zeichen gebrauch.

Doch auch das Kommando SetConsoleOutputCP aus der nicht dokumentierten Windows Unit hilft mir hier nicht weiter,
da egal welche CP ich eintrage die Ausgabe die gleiche bleibt und ich verstehe nicht wieso.

Und hier meine Frage zum Problem:
Wie bewerkstellige ich es diese grafischen Zeichen auf der Windows-Console auszugeben?

LG Blocktronic

Bild

Code: Alles auswählen

uses crt
//      windows {für SetConsoleOutputCP notwendig}
      ;
 
var   i
      :byte;
 
begin
   clrscr;
//   SetConsoleOutputCP(65001);      {obsolet da keine veränderung}
//   SetConsoleOutputCP(437);      {obsolet da keine veränderung}
//   SetConsoleOutputCP(850);      {obsolet da keine veränderung}
 
   for i:=128 to 255 do begin
      write( i:3, '= ',chr(i), '   ');
      if ( i mod(8) ) = 7 then writeln;
   end;
 
end.
 
Zuletzt geändert von Lori am Mi 22. Jan 2014, 12:44, insgesamt 1-mal geändert.
Grund: richtiger Highlighter

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Probleme mit Grafischen Zeichen in der Windows Console

Beitrag von Michl »

Hallo,

willkommen im Lazarusforum!

Mir ist nicht ganz klar, welche "grafischen" Zeichen du meinst?! Falls Du die Zeichen je nach Ascii-Tabelle meinst (kein UTF8-Zeichensatz), werden sie mir analog Deinem Code angezeigt:

Code: Alles auswählen

  clrscr;
  for i:=0 to 255 do begin
    write(i:3, '[', chr(i), ']  ');
    if i mod 8 = 7 then writeln;
  end;

Habe ich bei Projekt neu -> Anwendung und -> Konsolenanwendung getestet unter Win7, Lazarus 1.0.14 und Lazarus 1.3 r43776M FPC 2.7.1 i386-win32-win32/win64, beides gleich und gibt folgende Ausgabe:
Dateianhänge
Konsole.jpg

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Blocktronic
Beiträge: 7
Registriert: Di 21. Jan 2014, 15:07

Re: Probleme mit Grafischen Zeichen in der Windows Console

Beitrag von Blocktronic »

Hallo Michl,

nun ich meine jene grafischen Zeichen die in meinem Beispielbild Im Bereich Free-Pascal NICHT und YABasic sehr wohl sehen kann.
Diese besagten grafischen zeichen sind mysteriöserweise bei dir zu sehen, bei mir aber nicht. Stellt sich nun die Frage wieso?

Die man auch hier sehen kann --> ░ ▒ ▓ █ ═ │ usw.

Zur Info:
Ich Arbeite mittels UltraEdit und der Kommando-Konsole. Dabei kam das heraus was ich in meinem Beitrag anfänglich
berichtet habe. Bislang war es egal welche Compiler Optionen oder Funktionen ich benutzt habe, die Konsole spuckte
mir immer nur Zeichen in der CP 1201 Manier aus (Windows Default CodePage) nicht aber mit den Grafischen zeichen darin.

Mein FP Compiler hat die version 2.6.2 (64Bit) (ist auch die aktuelle version --> http://freepascal.org/download.var )

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Probleme mit Grafischen Zeichen in der Windows Console

Beitrag von m.fuchs »

Blocktronic hat geschrieben:Zur Info:
Ich Arbeite mittels UltraEdit und der Kommando-Konsole. Dabei kam das heraus was ich in meinem Beitrag anfänglich
berichtet habe. Bislang war es egal welche Compiler Optionen oder Funktionen ich benutzt habe, die Konsole spuckte
mir immer nur Zeichen in der CP 1201 Manier aus (Windows Default CodePage) nicht aber mit den Grafischen zeichen darin.

In welchem Format speicherst du denn die Dateien?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Blocktronic
Beiträge: 7
Registriert: Di 21. Jan 2014, 15:07

Re: Probleme mit Grafischen Zeichen in der Windows Console

Beitrag von Blocktronic »

Wow das geht ja hier schnell mit den Antworten, ich bin positiv überrascht :)

Hallo auch m.fuchs,
Nun ich speichere es im ASCII Format.

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Probleme mit Grafischen Zeichen in der Windows Console

Beitrag von Mathias »

Code: Alles auswählen

  for i:=0 to 255 do begin
    write(i:3, '[', chr(i), ']  ');
    if i mod 8 = 7 then writeln;
  end;

Wen "i" kleiner 32 ist, werden die Zeichen z.T. als Steuerzeichen interpretiert.

Wie bewerkstellige ich es diese grafischen Zeichen auf der Windows-Console auszugeben?

Vielleicht hast du in Windows ein anderer Zeichensatz für die Konsole eingestellt.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Blocktronic
Beiträge: 7
Registriert: Di 21. Jan 2014, 15:07

Re: Probleme mit Grafischen Zeichen in der Windows Console

Beitrag von Blocktronic »

Hallo Mathias,

also ich zähle ab Ascii Code 128 bis 255 in meinem Beispiel-Code und es ist in der Tat egal welche Schriftart ich einstelle,
denn wenn ich den Code in YABasic schreibe und direkt auf der gleichen Console ausgebe sehe ich die grafischen Zeichen,
mache ich das gleiche mit dem compilierten Free Pascal Code, fehlen die grafischen Zeichen.
Und dabei nutze ich immer den Zeichensatz Consolas für die Window-Console.

Früher unter Dos-Zeiten wäre das mit Zeichesatz eine tolle Idee gewesen, die ich damals auch gerne genutz hatte,
wenn auch zu anderen Zwecken. Unter Windows wirkt das irgendwie nicht. Doch hat mich das eben auf die Idee gebracht
folgenden Code auszuprobiern, leider auch ohne Erfolg:

Code: Alles auswählen

uses crt, windows;
 
var   i :byte;
 
begin
   clrscr;
   SetConsoleOutputCP(437);      {obsolet da keine veränderung}
 
   for i:=128 to 255 do begin
      write(  i:5, '=[', chr( i ), ']  '  );
      if i mod(8) = 7 then writeln;
   end;
end.

Ich hatte versucht mit dieser Änderung die Ausgabe auf die CP437 zu setzen,
was ich auch mittels shell commando MODE CON: CP SELECT=437 auf der
Console getan habe. Leider wie schon gesagt ohne eine Wirkung.

Hier mal die Codepages 437 und 850 --> http://de.wikipedia.org/wiki/Codepage_850
Interessant für mich sind insbondere die grafischen Zeichen ab Ascii-Code 176.

Würde mich echt mal interessieren warum das in Windows so ein Problem ist,
unter einem Linux-Terminal ist das alles kein Thema.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Probleme mit Grafischen Zeichen in der Windows Console

Beitrag von Michl »

Hatte gestern auch noch ein bischen gespielt, leider ohne Erfolg :(

Habe auch versucht (gem. diesem Link) Änderungen der Codepage von Windows durchzuführen.
- ein .bat erstellt, Codepage mittels "chcp 437" geändert und dann Konsolenprogramm ausgeführt (man kann auch per Hand in der Registry den Wert OEMCP bei HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage ändern)
- verschiedene möglichen Codepages geladen/getestet, die Ausgabe bleibt immer gleich:

Code: Alles auswählen

var
  i, PNr: Int32;
  c: Char;
const
  Pages: array[0..49] of UInt =
    (437, 667, 668, 720, 737, 770, 773, 775, 790, 808,
     819, 850, 851, 852, 853, 854, 855, 857, 858, 860,
     861, 862, 863, 864, 865, 866, 867, 868, 869, 872,
     895, 912, 915, 932, 991, 874, 936, 949, 950, 1250,
     1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 28604, 54936);
begin
  ...
  PNr:=0;
  c:='1';
  while (PNr < Length(Pages)) and (c <> #27) do begin  //Solange kein <ESC> gedrückt
    clrscr;
    writeln(Pages[PNr]);
    setConsoleCP(Pages[PNr]);
    setConsoleOutputCP(Pages[PNr]);
    writeln(getConsoleCP);
    writeln(getConsoleOutputCP);
    for i:=168 to 255 do begin
      write(i:3, '[', chr(i), ']  ');
      if i mod 8 = 7 then writeln;
    end;
    inc(PNr);
    c:=Readkey;
  end;
  ... 

Lt. Ausgabe der Konsole wird die Codepage bei beiden Versionen gewechselt, die ausgegebenen Zeichen bleiben gleich (Konsolenprogramm unter Lazarus oder auch Konsolenprogramm direkt per FPC kompiliert).

Kann daher das Verhalten von Dir bestätigen, eine wirkliche Lösung (außer, daß Du evtl. nochmal versuchst, die Codepage in der Registry manuell umzustellen) weiß ich leider nicht.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

shokwave
Beiträge: 470
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: Probleme mit Grafischen Zeichen in der Windows Console

Beitrag von shokwave »

Blocktronic hat geschrieben:Und dabei nutze ich immer den Zeichensatz Consolas für die Window-Console.

Default wäre aber Rasterschriftart 8x12. Mit dem default sehe ich die Zeichen, mit "Consolas" sehe ich die Zeichen nicht.
Habe unter Win7 x32 mit Fpc 2.6.2 getestet.
mfg Ingo

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Probleme mit Grafischen Zeichen in der Windows Console

Beitrag von Mathias »

Bei mir kommen die Zeichen sogar mit mit "Consolas".
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Blocktronic
Beiträge: 7
Registriert: Di 21. Jan 2014, 15:07

Re: Probleme mit Grafischen Zeichen in der Windows Console

Beitrag von Blocktronic »

Nun ich hatte es mit allen Fonts ausprobiert die ich auswählen kann.
Sind 3 Stück "Consolas", "Lucida Console" und "Rasterschriftart".
Ergebnis es ändert sich nichts, die Ausgabe ist immer die gleiche,
aber nie die erwünschte.

So langsam habe ich das Gefühl das es einfacher wäre sich eine
eige Console bzw Terminal zu schreiben als auf diese Windows-Console
zurück zu greifen. Dieser Gedanke wäre vor allem hinsichtlich weiterer
Zusatzfunkionaliäten eine sehr interessante Idee. :)

Denn scheinbar bin ich nicht alleine mit meiner Ratlosgikeit,
was die Windows-Konsolen-Problematik angeht.

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Probleme mit Grafischen Zeichen in der Windows Console

Beitrag von Mathias »

Hast du keine Möglichkeit deine EXE auf einem anderen PC zu testen ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Blocktronic
Beiträge: 7
Registriert: Di 21. Jan 2014, 15:07

Re: Probleme mit Grafischen Zeichen in der Windows Console

Beitrag von Blocktronic »

Habe ich auch schon getan, überall das gleiche Resultat.

Nachtrag:
Dumm an der Problematik ist halt das es auf meinen Kisten nicht klappt,
während es bei anderen Klappt, und bei anderen auch mal nicht aber keiner
weiss warum, oder wie man das Fixen kann. Daher denke ich ist meine IDee
von eben gar nicht so falsch mit der eigenen Console/Terminal.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Probleme mit Grafischen Zeichen in der Windows Console

Beitrag von Michl »

shokwave hat geschrieben:Default wäre aber Rasterschriftart 8x12. Mit dem default sehe ich die Zeichen, mit "Consolas" sehe ich die Zeichen nicht.

Habe ich jetzt auch noch getestet und siehe da, der Zeichensatz ist tatsächlich anders (wahrscheinlich sind die Symbole in der Zeichentabelle dort anders als bei "Terminal" hinterlegt):

Code: Alles auswählen

type
  TFontName = array[1..LF_FACESIZE] of WideChar;
  TCONSOLE_FONT_INFOEX = record
    cbSize: Cardinal;
    nFont: LongWord;
    dwFontSize: TSmallPoint;
    FontFamily: Cardinal;
    FontWeight: Cardinal;
    FaceName: TFontName;
  end;
 
function SetCurrentConsoleFontEx( ConsoleOutput : THandle; MaximumWindow : BOOL; const ConsoleInfo: TCONSOLE_FONT_INFOEX ) : BOOL; stdcall; external kernel32;
function GetCurrentConsoleFontEx( ConsoleOutput : THandle; MaximumWindow : BOOL; var ConsoleInfo: TCONSOLE_FONT_INFOEX ) : BOOL; stdcall; external kernel32;
 
procedure SetConsoleFont(const AFontSize: word; const AFontName: TFontName);
var ci : TCONSOLE_FONT_INFOEX;
    ch : THandle;
begin
  if NOT CheckWin32Version( 6, 0 ) then
    EXIT;
 
  FillChar( ci, SizeOf(TCONSOLE_FONT_INFOEX), 0 );
  ci.cbSize:= SizeOf(TCONSOLE_FONT_INFOEX);
 
  ch:= GetStdHandle( STD_OUTPUT_HANDLE );
  if GetCurrentConsoleFontEx( ch, FALSE, ci ) then
  begin
    ci.FontFamily:= FF_DONTCARE;
    ci.dwFontSize.X:= 0;
    ci.dwFontSize.Y:= AFontSize;
    ci.FontWeight:= FW_BOLD;
    ci.FaceName:= AFontName;
    SetCurrentConsoleFontEx( ch, FALSE, ci );
  end
  else
    WriteLn( SysErrorMessage(GetLastError) );
end;
 
...
 
  SetConsoleFont(16, 'Consolas');
  for i:=128 to 255 do begin
    write(i:3, '[', chr(i), ']  ');
    if i mod 8 = 7 then writeln;
  end;
  Readln;   


[Edit] Was ich mir auch noch vorstellen könnte, ist, dass es Unterschiede zwischen 32 und 64bit gibt. Ich habe zwar ein 64bit Win7, nutze aber FPC/Lazarus 32bit...
Dateianhänge
Konsole.jpg

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Blocktronic
Beiträge: 7
Registriert: Di 21. Jan 2014, 15:07

Re: Probleme mit Grafischen Zeichen in der Windows Console

Beitrag von Blocktronic »

Nun ich fasse die Fakten nochmal zusammen:

■ Ich sehe mit der Schriftart Consolas (und allen anderen) immer das gleiche.
■ Unter YABasic werden die grafischen Zeichen korrekt ausgegeben.
■ Unter Free Pascal werden die grafischen Zeichen nicht korrekt ausgegeben.
■ Verschiedene Leute bekommen unter Verschiedenen System-Konstellationen (64/32 Bit und Fonts) zu unterschiedlichen Ergebnissen

Fazit:
Der Hersteller der Windows-Console hat sich hier offenbar keine großen mühen gemacht hier für
Kompatibeliät und vor allem Durchblick zu sorgen, da sonst schließlich jeder wüsste wo hier das
Problem liegt und wir uns deshalb hier nicht so lange Ziel und Planlos darüber unterhalten müssten.

Daher möchte ich mich sehr dafür bedanken das Ihr mir eure Aufmerksamkeit und Zeit zur
Widmung dieses Problems gegeben habt. Ich mache an dieser Stelle für mich einen Strich,
und konzentriere mich nun konstruktiv auf das erstellen einer eigenen Konsole mit
ANSI-COLOR-Emulation und vermutlich mit noch einigen Extras, in die ich Idealerweise
gleich noch eine bessere Shell integrieren könnte und vermutlich auch werde.

Insofern sehe ich es als sehr Positiv an, da nun etwas neues entstehen wird.
Vermutlich werde ich dieses Terminal für Windows dann auch als Freeware in die Welt entlassen.


LG und Vielen Dank nochmal

.........───══(oOo)══───.........
euer ░▒▓█ Blocktronic █▓▒░
.........───══(oOo)══───.........

Antworten