Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi CharSet (Single-Byte / Multi-Byte) eines Fonts ermitteln (https://www.delphipraxis.net/56867-charset-single-byte-multi-byte-eines-fonts-ermitteln.html)

taipan84 12. Nov 2005 14:58


CharSet (Single-Byte / Multi-Byte) eines Fonts ermitteln
 
Gibt es eine (elegante) Möglichkeit, zu ermitteln, aus was für einem Character Set eine Schriftart besteht?

Ich meine damit speziell, ob es sich um Single-Byte ("0x00", z.B. "Wingdings") oder Double-Byte ("0x0000", z.B. Unicode/UTF) handelt, oder auch direkt, aus wievielen Byte sich die Character zusammensetzen (läuft auf's Gleiche hinaus).

Habe schon das halbe Netz durchwühlt und natürlich auch die Forensuche benutzt, aber zu dem Thema kann ich nix sinnvolles finden...

Hoffentlich kann mir da jemand helfen... :roteyes:

taipan84 17. Nov 2005 00:28

Re: CharSet (Single-Byte / Multi-Byte) eines Fonts ermitteln
 
Kennt denn vielleicht jemand eine Unit, die die Eigenschaften von Schriftarten kapselt o.ä.?
Oder eventuell mir nicht bekannte (und auch durch Suche / Delphi-Hilfe nicht lokalisierbare) Methoden / Eigenschaften von TFont, mit denen ich hier arbeiten könnte?
Gerne auch eine systemnahe Routine oder API-Befehle...

(BTW: Ich weiss, es handelt sich hier zur halbwegs um nen Push, aber anders vermag ich diese Frage nicht länger als 4 Stunden im Blickfeld zu halten - deswegen habe ich schließlich auch einige Tage gewartet...)

himitsu 17. Nov 2005 00:55

Re: CharSet (Single-Byte / Multi-Byte) eines Fonts ermitteln
 
Also ich hab da auch noch nichts gefunden und ich suche da schon (mehr, oder weniger Intensiv) seit über 'nem Jahr danach.

Wobei ich sogar noch gern wissen würde welches Zeichen tatsächlich im Font vorhanden sind, oder wo nur ein Füll-/Dummyzeichen da ist.


Und zu meinem Bedauern konnte ich da bisher auch noch nichts wirklich brauchbares entdecken.


PS: das mit dem "Im Blick halten" ... versuch es doch mal mit http://www.delphipraxis.net/images/p...n_favorite.gif

taipan84 17. Nov 2005 20:29

Re: CharSet (Single-Byte / Multi-Byte) eines Fonts ermitteln
 
"Im Blick halten" --> ich meinte damit eher für andere User ;)

Also ich hatte da im MSDN die Funktion MSDN-Library durchsuchenIsDBCSLeadByteEx gefunden, aber man bräuchte natürlich ein Zeichen, das in allen Multibyte Character Set Fonts verlässlicherweise immer 2 Byte verbrät - sonst könnte man den Unterschied zu den Singlebyte Character Sets nicht erkennen.

Ne andere Möglichkeit sind die Dateien (z.B. "Webdings.ttf") selbst... vielleicht bekommen wir irgendwie raus, ob bzw. wo in den Dateien festgelegt wird, ob es sich um SBCS oder DBCB/MBCS handelt...

Aber da stehe ich auch aufm Schlauch. Echt schade, dass sich da irgendwie kaum einer mit auskennt :roll:

Flocke 17. Nov 2005 21:07

Re: CharSet (Single-Byte / Multi-Byte) eines Fonts ermitteln
 
IsDBCSLeadByteEx hat nichts mit einem Font zu tun sondern nur mit der angegebenen Codepage.

1. MSDN-Library durchsuchenGetTextMetricW liefert dir eine TEXTMETRICW-Struktur (weiß jetzt nicht wie die in Delphi heißt), da stehen u.a. die Felder
Zitat:

Zitat von MSDN
tmFirstChar
Specifies the value of the first character defined in the font.
tmLastChar
Specifies the value of the last character defined in the font.
tmDefaultChar
Specifies the value of the character to be substituted for characters not in the font.
tmBreakChar
Specifies the value of the character that will be used to define word breaks for text justification.

2. MSDN-Library durchsuchenGetFontUnicodeRanges liefert dir die in der Schrift definierten Zeichen.

3. Du könntest MSDN-Library durchsuchenGetGlyphIndicesW mit einem String von TEXTMETRICW.tmFirstChar bis TEXTMETRICW.tmLastChar und Parameter GGI_MARK_NONEXISTING_GLYPHS aufrufen und dann im Ergebnisarray überprüfen, welche Zeichen es wirklich gibt.

Alle Funktionen erwarten einen HDC (-> TCanvas.Handle), in den die betreffende Schrift selektiert ist.

taipan84 18. Nov 2005 19:49

Re: CharSet (Single-Byte / Multi-Byte) eines Fonts ermitteln
 
@ Flocke:

Danke für die Hilfe - dennoch muss ich nachfragen, inwiefern ich mit dieser Funktion feststellen kann, ob einem Font ein SCBS oder ein MBCS zu Grunde liegt, da fehlt mir wohl noch etwas die Übersicht bzw. der Zusammenhang... wäre nett, wenn du mir das noch erklären könntest!

Flocke 18. Nov 2005 20:42

Re: CharSet (Single-Byte / Multi-Byte) eines Fonts ermitteln
 
Wenn es sich um einen TrueType-Font handelt, dann sind die Zeichen darin immer Unicode-codiert.
Zitat:

Zitat von ttf_spec.doc
Font files for Microsoft platfoms must use Unicode indicies (given here as hexadecimal values).

(Siehe auch http://www.microsoft.com/typography/...sOverview.mspx)

Die einzige Möglichkeit ist, nachzusehen, welche Zeichen wirklich in der Schrift vorkommen. Du könntest halt prüfen, ob ein Unicode-Zeichen >=$100 vorkommt - das ist aber in fast jeder Schrift der Fall.

Zu deiner Frage, aus wievielen Bytes sich ein Zeichen zusammensetzt: das hat nichts mit der Schrift zu tun, nur mit der ausgewählten Codepage.

taipan84 19. Nov 2005 01:29

Re: CharSet (Single-Byte / Multi-Byte) eines Fonts ermitteln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Okay, da wird mir schon einiges klarer...

Ich versuche dann mal zu redefinieren, worauf ich hinaus will: Im Screenshot sieht man eindeutig den TrueType-Font "SymbolPS", der mitgeliefert wird bei WinXP. Diese Schriftart bietet allerdings nur 255 Zeichen, erkennbar an der Zeichendarstellung "0x00" (1 Byte). Schaue ich mir die anderen Schriftarten in der Zeichentabelle an, so steht dort fast überall "U+0000" (2 Byte).

Für mich ist eine Unterscheidung nötig zwischen solchen Schriftarten mit 255 Zeichen (meist Symbol-Schriftarten - hängt dies vielleicht hiermit zusammen?) und den restlichen...

Hoffentlich wird es nun klarer, dazu habe ich den Screenshot angehängt.

himitsu 19. Nov 2005 01:33

Re: CharSet (Single-Byte / Multi-Byte) eines Fonts ermitteln
 
Das Problem it aber, daß selbst wenn der Font nur SingleBytes enthält, daß in ANSI dennoch einige der Zeichen MultiBytes sind, da dieses Zeichen nicht in den ersten 256 Bytes des ANSI-Zeichensatzes vorkommen, ebenso kann es sein, das dieses Zeichen überhaupt nicht von ANSI unterstützt wird ... also das Zeichen zwar im Font vorhanden ist, aber nicht in ANSI.

Flocke 19. Nov 2005 10:14

Re: CharSet (Single-Byte / Multi-Byte) eines Fonts ermitteln
 
Ich denke mal es liegt wirklich daran, dass es Symbol-Schriftarten sind, deren Zeichencodes keine Übereinstimmung mit Unicode haben.

Lass dir für diverse Schriften mal das Feld TEXTMETRIC.tmCharSet anzeigen. Über das Feld kannst du erkennen, ob der Zeichensatz der Schriftart OEM_CHARSET oder SYMBOL_CHARSET ist.

Ich könnte mir übrigens durchaus vorstellen, dass die von dir abgeknippste Anzeige das dahingehend unterscheidet, ob für TEXTMETRIC.tmLastChar 8 Bits ausreichen oder 16 Bits benötigt werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:30 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz