Konsolem, Unicode und Schriftart ändern

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
TroaX
Beiträge: 699
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Konsolem, Unicode und Schriftart ändern

Beitrag von TroaX »

Halli Hallo,

Ich habe da mal eine Frage. Wahrscheinlich eher leichter Natur. Aber trotzdem interessant.

Unicode in seinem rieisgem Umfangbietet ja einem die Möglichkeit, mit Zeichen auch Emotes und Co zu verwenden. Ich bastel gerade mit Hilfe der grafischen Konsole und der Windows-API an einem Modul, das es vereinfachen soll, eine einfache GUI zu ermöglichen. Unter Windows kann man sowas zwar nur per Tastatur steuern. Aber trotzdem ist das deutlich angenehmer, als wenn man ständig Konsolen-Befehle eintippen muss.

Ich würde dabei gerne natürlich auch die Möglichkeit dieser erweiterten Symbole geben. Ich weiß nur nicht, wie ich sie auf das Display bringen soll. Lucidas und wechseln der Codepage (65001) haben nicht geholfen. Gibt es da eine Möglichkeit zu oder kann das die Konsole überhaupt nicht?

PS: Aktuell arbeite ich noch an grafische Möglichkeiten der Konsole. Erst wenn alles so umsetzbar ist, wie ich mir das vorstelle, mach ich da ein Modul draus.

Theoretisch mit dem richtigen Zeichensatz sollte doch das komplette Spektrum möglich sein: https://unicode-table.com/de/
Zuletzt geändert von TroaX am 01.01.2017 23:18, insgesamt 1-mal geändert.
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: N150 Mini-PC | 16 GB RAM | Debian 13+CasaOS
Coding: Purebasic, Spiderbasic, GDevelop, PHP
Blog: https://techtroax.de
Repos: https://codeberg.org/TroaX
Benutzeravatar
TroaX
Beiträge: 699
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Re: Konsole und Unicode

Beitrag von TroaX »

Hat sich erledigt! Sorry für das leider nutzlose Thema. Aber vielleicht hilft die Lösung ja anderen weiter:
Ändern der Codepage war nicht nötig. Die Konsole beherrscht seit NT grundsätzlich Unicode. Allerdings bei weitem nicht den kompletten Umfang. Unicode 6 Emoji's etc. kann sie anscheinend nicht. Damit muss man leben. Das habe ich mit Noto Emoji getestet. Die Schriftart wurde neben den klassichen Zeichen um die Emoji-Zeichen unter den jeweilen Unicode-Werten erweitert. Selbst diese Schriftart trotz korrekter Codepage, korrekten Character-Wert und sogar dem Umweg über Speicherpuffer und den verschiedensten Kodierungsmodis gibt er mir diese Zeichen nicht aus.

Da ich nicht unbedingt wollte, das die ganze Sache auf fremde Schriftarten angewiesen ist, habe ich mich einmal auf die Suche gemacht, was welche vorinstallierte Schriftart unterstützen.

Die Schriftarten Courier New sowie Consolas bieten recht umfangreichen Unicode-Supprt. Gerade für Symbole den besten Support bietet definitiv MS Gothic.

Man kann nach den Ranges in Listen nach den Codes suchen. Folgende Ranges der installierten Schriften werden supportet:
MS Gothic:

Code: Alles auswählen

Basic Latin
Latin-1 Supplement
Latin Extended-A
Latin Extended-B
IPA Extensions
Spacing Modifier Letters
Combining Diacritical Marks
Greek and Coptic
Cyrillic, Cyrillic Supplementary
Latin Extended Additional
Greek Extended
General Punctuation
Superscripts And Subscripts
Currency Symbols
Letterlike Symbols
Number Forms
Arrows, Supplemental Arrows-A, Supplemental Arrows-B
Mathematical Operators, Supplemental Mathematical Operators, Miscellaneous Mathematical Symbols-A, Miscellaneous Mathematical Symbols-B
Miscellaneous Technical
Control Pictures
Enclosed Alphanumerics
Box Drawing
Block Elements
Geometric Shapes
Miscellaneous Symbols
Dingbats
CJK Symbols And Punctuation
Hiragana
Katakana, Katakana Phonetic Extensions
Enclosed CJK Letters And Months
CJK Compatibility
Non-Plane 0
CJK Unified Ideographs, CJK Radicals Supplement, Kangxi Radicals, Ideographic Description Characters, CJK Unified Ideograph Extension A, CJK Unified Ideographs Extension B, Kanbun
CJK Compatibility Ideographs, CJK Compatibility Ideographs Supplement
Alphabetic Presentation Forms
CJK Compatibility Forms
Halfwidth And Fullwidth Forms
Variation Selectors
Consolas:

Code: Alles auswählen

Basic Latin
Latin-1 Supplement
Latin Extended-A
Latin Extended-B
IPA Extensions
Spacing Modifier Letters
Combining Diacritical Marks
Greek and Coptic
Cyrillic, Cyrillic Supplementary
Thai
Latin Extended Additional
Greek Extended
General Punctuation
Superscripts And Subscripts
Currency Symbols
Combining Diacritical Marks For Symbols
Letterlike Symbols
Number Forms
Arrows, Supplemental Arrows-A, Supplemental Arrows-B
Mathematical Operators, Supplemental Mathematical Operators, Miscellaneous Mathematical Symbols-A, Miscellaneous Mathematical Symbols-B
Miscellaneous Technical
Enclosed Alphanumerics
Box Drawing
Block Elements
Geometric Shapes
Miscellaneous Symbols
Dingbats
Alphabetic Presentation Forms
Combining Half Marks
Arabic Presentation Forms-B
Courier New:
Basic Latin
Latin-1 Supplement
Latin Extended-A
Latin Extended-B
IPA Extensions
Spacing Modifier Letters
Combining Diacritical Marks
Greek and Coptic
Cyrillic, Cyrillic Supplementary
Hebrew
Arabic
Latin Extended Additional
Greek Extended
General Punctuation
Superscripts And Subscripts
Currency Symbols
Mathematical Operators, Supplemental Mathematical Operators, Miscellaneous Mathematical Symbols-A, Miscellaneous Mathematical Symbols-B
Box Drawing
Block Elements
Geometric Shapes
Miscellaneous Symbols
Alphabetic Presentation Forms
Arabic Presentation Forms-A
Combining Half Marks
Arabic Presentation Forms-B
Lucida Console:

Code: Alles auswählen

Basic Latin
Latin-1 Supplement
Latin Extended-A
Latin Extended-B
Greek and Coptic
Cyrillic, Cyrillic Supplementary
General Punctuation
Box Drawing
Block Elements
Lucida Sans Typewriter:

Code: Alles auswählen

0000..007F Basic Latin (95)
0080..00FF Latin-1 Supplement (96)
0100..017F Latin Extended-A (6)
0180..024F Latin Extended-B (1)
02B0..02FF Spacing Modifier Letters (9)
0370..03FF Greek and Coptic (1)
2000..206F General Punctuation (15)
20A0..20CF Currency Symbols (1)
2100..214F Letterlike Symbols (2)
2200..22FF Mathematical Operators (13)
25A0..25FF Geometric Shapes (1)
E000..F8FF Private Use Area (2)
FB00..FB4F Alphabetic Presentation Forms (2)
Nun wieder ein kleiner Dämpfer. Nur MS Gothic war wirklich in der Lage, bisher jedes gemäß der Ranges von mir gesuchte Zeichen auf der Konsole anzuzeigen. Ich glaube zwar nicht, das sie wirklich alle hinbekommt. Aber bisher hatte sie alle geschafft. Consolas sowie Courier hingegen haben mir zu oft geschwächelt. Daher gebe ich auf diese Liste keine Gewähr.

Vielleicht hilft es ja noch jemand anderem.

PS: Ein peeken aus dem Buffer ist nicht nötig und für den richtigen Code muss oben in der verlinkten Seite die HTML Unicode-Darstellung auf dezimal gestellt werden und dann die Nummer aus der Spalte für die nummerische Darstellung kopiert werden (ohne Sonderzeichen .... nur die Ziffern).
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: N150 Mini-PC | 16 GB RAM | Debian 13+CasaOS
Coding: Purebasic, Spiderbasic, GDevelop, PHP
Blog: https://techtroax.de
Repos: https://codeberg.org/TroaX
Benutzeravatar
TroaX
Beiträge: 699
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Re: Konsolem, Unicode und Schriftart ändern

Beitrag von TroaX »

Darauf aufbauende Frage:

Ich versuche gerade über die Windows-API die Schriftart der Console bei Programmstart auf MS Gothic zu setzen. Das klappt aber nicht. Die API-Prozedur SetCurrentConsoleFontEx() geben False aus.

Jemand eine Idee? Ich bin mir sicher, das etwas mit der Struktur nicht stimmt. Nur was ist die große Frage ^^

Code: Alles auswählen

ImportC "msvcrt.lib"
  system(cmd.p-utf8)
EndImport

; Struktur für Schriftinfos
Structure CONSOLE_FONT_INFOEX
  cbSize.i
  nFont.i
  dwFontSize.COORD
  FontFamily.i
  FontWeight.i
  FaceName.s
EndStructure

; API laden
If OpenLibrary(0, "Kernel32.dll")
  Prototype GetConsoleWindow()
  Prototype SetCurrentConsoleFontEx(handle.i,wSize.b,*structhandle)
  Prototype GetCurrentConsoleFontEx(handle.i,wSize.b,*structhandle)
  Define GetConsoleWindow.GetConsoleWindow = GetFunction(0, "GetConsoleWindow")
  Define SetCurrentConsoleFontEx.SetCurrentConsoleFontEx = GetFunction(0, "SetCurrentConsoleFontEx")
  Define GetCurrentConsoleFontEx.GetCurrentConsoleFontEx = GetFunction(0, "GetCurrentConsoleFontEx")
  CloseLibrary(0)
EndIf

; Konsole öffnen
If OpenConsole("Kleiner Test")
  If EnableGraphicalConsole(1)
    ConsoleHandle = GetConsoleWindow()
    
    ; == Der interessante Teil == ;
    Define FontInfo.CONSOLE_FONT_INFOEX
    FontInfo\cbSize = SizeOf(CONSOLE_FONT_INFOEX)
    FontInfo\dwFontSize\x = 24
    FontInfo\dwFontSize\y = 12
    FontInfo\FontFamily = #TMPF_TRUETYPE
    FontInfo\nFont = 5                        ; Habe ich für den Index der Schriftart gehalten
    Debug SetCurrentConsoleFontEx(ConsoleHandle,#False,FontInfo)   ; Gibt 0 (False) aus
    
    
    SetWindowLongPtr_(ConsoleHandle, #GWL_STYLE, GetWindowLongPtr_(ConsoleHandle, #GWL_STYLE) &~ #WS_SIZEBOX ! #WS_MAXIMIZEBOX ! #WS_MINIMIZEBOX)
    System("mode 128,32")
    ClearConsole()
    BalkenH.s = Space(128)
    BalkenV.s = ""
    ConsoleColor(6,6)
    Print(BalkenH)
    ConsoleLocate(0,0)
    For i=0 To 31
      ConsoleLocate(0,i)
      Print("  ")
    Next i
    For i=0 To 31
      ConsoleLocate(126,i)
      Print("  ")
    Next i
    ConsoleLocate(0,31)
    Print(BalkenH)
    
    ConsoleColor(7,3)
    ConsoleLocate(2,1)
    Print("(1) Datei")
    
    ConsoleLocate(12,1)
    Print("(2) Bearbeiten")
    
    ConsoleLocate(27,1)
    Print("(3) Hilfe")
    
    ConsoleLocate(27,20)
    Test.s = Chr(10004) + " "
    Print(Test)
    
    Input()

  EndIf
EndIf
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: N150 Mini-PC | 16 GB RAM | Debian 13+CasaOS
Coding: Purebasic, Spiderbasic, GDevelop, PHP
Blog: https://techtroax.de
Repos: https://codeberg.org/TroaX
Benutzeravatar
man-in-black
Beiträge: 362
Registriert: 21.08.2006 17:39

Re: Konsolem, Unicode und Schriftart ändern

Beitrag von man-in-black »

Hi,

nur mal so zwischen Tür und Angel. Deine Datentypen passen nicht zu denen, die gefordert werden:

-Integer ist z.B. in PB bei 64bit 8byte groß. Gefordert werden an der Stelle aber u.A. unsigned longs mit 4byte.
-Die Strings werden in der "richtigen" Ausführung als Char-Kette in der Strukture hinterlegt. So wie du es machst,
hinterlegt PB nur eine Referenz in die Struktur. (-> FaceName.s{LF...})

Code: Alles auswählen

typedef struct _CONSOLE_FONT_INFOEX {
  ULONG cbSize;    (4byte)
  DWORD nFont;    (4byte)
  COORD dwFontSize; (4byte = 2x 2byte)
  UINT  FontFamily;  (2byte)
  UINT  FontWeight;   (2byte)
  WCHAR FaceName[LF_FACESIZE];   (<32x 2byte)
} CONSOLE_FONT_INFOEX, *PCONSOLE_FONT_INFOEX;
Wie der Typ heißt und ob er signed oder unsigned ist, ist erstmal egal. Wichtig ist die gleiche Größe!

Struktur:
https://msdn.microsoft.com/de-de/librar ... s.85).aspx

Typen in C++ (gefordert):
https://www.tutorialspoint.com/cprogram ... _types.htm

Typen in PB (Int beachten!!)
https://www.purebasic.com/german/docume ... ables.html

__________________________________________________
URL-Tags hinzugefügt
02.01.2017
RSBasic
(hab alles, kann alles, weiß alles!!^^)

Bild
Benutzeravatar
TroaX
Beiträge: 699
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Re: Konsolem, Unicode und Schriftart ändern

Beitrag von TroaX »

Danke für den Hinweis. Aber ich hatte es auch schon so:

Code: Alles auswählen

Structure CONSOLE_FONT_INFOEX
  cbSize.l
  nFont.l
  dwFontSize.COORD
  FontFamily.u
  FontWeight.u
  FaceName.s{9}
EndStructure

...

; == Der interessante Teil == ;
Define FontInfo.CONSOLE_FONT_INFOEX
FontInfo\cbSize = SizeOf(CONSOLE_FONT_INFOEX)
Debug GetCurrentConsoleFontEx(ConsoleHandle,#False,FontInfo)
FontInfo\dwFontSize\x = 24
FontInfo\dwFontSize\y = 12
FontInfo\FontFamily = #TMPF_TRUETYPE
FontInfo\FaceName = "MS Gothic"
FontInfo\nFont = 5                        ; Habe ich für den Index der Schriftart gehalten
Debug SetCurrentConsoleFontEx(ConsoleHandle,#False,FontInfo)   ; Gibt 0 (False) aus

...
Ich hatte nur vergessen, das ganze beim posten wieder zurückzubauen. Ich habe da wirklich schon viel probiert. Hatte die Größe auch schon in Verdacht. Aber es scheint etwas anderes zu sein. Da aber Get... auch fehlschlägt vermute ich vielleicht, das es vielleicht an nFont und der Tatsache, das es vorzeichenlos sein muss, liegt. Denn ohne Vorzeichen ist der positive Wertebereich ja auch größer. Meine Vermutung daher, das nFont wie ich es übergebe ungültig (zu klein ist) und GetCurrentConsoleFontEx einen zu großen hinneinschreiben will.

EDIT: Auch das wäre geschafft. Habe durch Zufall eine Lösung gefunden. Es lag zum einen am Konsolen-Handle und zum anderen am Charstack der Struktur. Jetzt startet die Anwendung auch mit der MS Gothic Schriftart:
Bild
Ich muss ja mal so sagen. Für eine Konsole sieht das schon irgendwie klasse aus ^^

Code:

Code: Alles auswählen

ImportC "msvcrt.lib"
  system(cmd.p-utf8)
EndImport

; Struktur für Schriftinfos
Structure CONSOLE_FONT_INFOEX
  cbSize.l
  nFont.l
  dwFontSize.COORD
  FontFamily.l
  FontWeight.l
  FaceName.u[#LF_FACESIZE]
EndStructure

; API laden
If OpenLibrary(0, "Kernel32.dll")
  Prototype GetConsoleWindow()
  Prototype SetCurrentConsoleFontEx(handle.i,wSize.b,*structhandle)
  Prototype GetCurrentConsoleFontEx(handle.i,wSize.b,*structhandle)
  Define GetConsoleWindow_.GetConsoleWindow = GetFunction(0, "GetConsoleWindow")
  Define SetCurrentConsoleFontEx_.SetCurrentConsoleFontEx = GetFunction(0, "SetCurrentConsoleFontEx")
  Define GetCurrentConsoleFontEx_.GetCurrentConsoleFontEx = GetFunction(0, "GetCurrentConsoleFontEx")
  CloseLibrary(0)
EndIf

; Konsole öffnen
If OpenConsole("Kleiner Test")
  If EnableGraphicalConsole(1)
    ConsoleOutputHandle = GetStdHandle_(#STD_OUTPUT_HANDLE)
    ConsoleWindowHandle = GetConsoleWindow_()
    ; == Der interessante Teil == ;
    Define FontInfo.CONSOLE_FONT_INFOEX
    FontInfo\cbSize = SizeOf(CONSOLE_FONT_INFOEX)
    FontInfo\dwFontSize\x = 0
    FontInfo\dwFontSize\y = 24
    FontInfo\FontFamily = #TMPF_TRUETYPE
    PokeS(@FontInfo\FaceName, "MS Gothic", -1, #PB_Unicode)    
    SetCurrentConsoleFontEx_(ConsoleOutputHandle,#False,FontInfo)
    
    SetWindowLongPtr_(ConsoleWindowHandle, #GWL_STYLE, GetWindowLongPtr_(ConsoleWindowHandle, #GWL_STYLE) &~ #WS_SIZEBOX ! #WS_MAXIMIZEBOX ! #WS_MINIMIZEBOX)
    System("mode 128,32")
    ClearConsole()
    BalkenH.s = Space(128)
    BalkenV.s = ""
    ConsoleColor(6,6)
    Print(BalkenH)
    ConsoleLocate(0,0)
    For i=0 To 31
      ConsoleLocate(0,i)
      Print("  ")
    Next i
    For i=0 To 31
      ConsoleLocate(126,i)
      Print("  ")
    Next i
    ConsoleLocate(0,31)
    Print(BalkenH)
    
    ConsoleColor(7,3)
    ConsoleLocate(2,1)
    Print("(1) Datei")
    
    ConsoleLocate(12,1)
    Print("(2) Bearbeiten")
    
    ConsoleLocate(27,1)
    Print("(3) Hilfe")
    
    ConsoleLocate(3,3)
    ConsoleColor(2,0)
    Print(Chr(9843)+" ")
    ConsoleColor(7,0)
    Print(" Installation abgeschlossen")
    ConsoleLocate(3,4)
    ConsoleColor(2,0)
    Print(Chr(9872)+" ")
    ConsoleColor(7,0)
    Print(" Konfiguration abgeschlossen")
    ConsoleLocate(3,5)
    ConsoleColor(2,0)
    Print(Chr(9874)+" ")
    ConsoleColor(7,0)
    Print(" Benutzersetup abgeschlossen")
    ConsoleLocate(3,6)
    ConsoleColor(2,0)
    Print(Chr(9876)+" ")
    ConsoleColor(7,0)
    Print(" Datenbank gestartet")
  
    Input()
  EndIf
EndIf
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: N150 Mini-PC | 16 GB RAM | Debian 13+CasaOS
Coding: Purebasic, Spiderbasic, GDevelop, PHP
Blog: https://techtroax.de
Repos: https://codeberg.org/TroaX
Benutzeravatar
HeX0R
Beiträge: 3056
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Konsolem, Unicode und Schriftart ändern

Beitrag von HeX0R »

Du könntest auch damit arbeiten, dann brauchst Du die Apis nicht.
Musst halt nur noch Farben einbauen, hatte ich damals nicht benötigt, wollte es aber eigentlich mal noch integrieren.
Antworten