AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi CharSet (Single-Byte / Multi-Byte) eines Fonts ermitteln
Thema durchsuchen
Ansicht
Themen-Optionen

CharSet (Single-Byte / Multi-Byte) eines Fonts ermitteln

Ein Thema von taipan84 · begonnen am 12. Nov 2005 · letzter Beitrag vom 20. Nov 2005
Antwort Antwort
Seite 1 von 2  1 2      
taipan84

Registriert seit: 12. Nov 2005
7 Beiträge
 
#1

CharSet (Single-Byte / Multi-Byte) eines Fonts ermitteln

  Alt 12. Nov 2005, 15:58
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...
  Mit Zitat antworten Zitat
taipan84

Registriert seit: 12. Nov 2005
7 Beiträge
 
#2

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

  Alt 17. Nov 2005, 01:28
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...)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.088 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt 17. Nov 2005, 01:55
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
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
taipan84

Registriert seit: 12. Nov 2005
7 Beiträge
 
#4

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

  Alt 17. Nov 2005, 21:29
"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
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

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

  Alt 17. Nov 2005, 22:07
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 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.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
taipan84

Registriert seit: 12. Nov 2005
7 Beiträge
 
#6

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

  Alt 18. Nov 2005, 20:49
@ 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!
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

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

  Alt 18. Nov 2005, 21:42
Wenn es sich um einen TrueType-Font handelt, dann sind die Zeichen darin immer Unicode-codiert.
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.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
taipan84

Registriert seit: 12. Nov 2005
7 Beiträge
 
#8

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

  Alt 19. Nov 2005, 02:29
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.
Miniaturansicht angehängter Grafiken
screeny_330.png  
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.088 Beiträge
 
Delphi 12 Athens
 
#9

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

  Alt 19. Nov 2005, 02:33
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

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

  Alt 19. Nov 2005, 11:14
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.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:44 Uhr.
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