![]() |
Überprüfen ob Char ein vernünftiges Zeichen enthält?
Hi, gibt es eine Funktion, mit deren Hilfe ich überpfüfen kann, ob ein Char einen darstellbaren Wert enthält? (Buchstabe, Ziffer, Sonderzeichen) und nicht sowas wie #0 oder irgend so ein schwarzes Kästchen
danke |
Re: Überprüfen ob Char ein vernünftiges Zeichen enthält?
![]() Im Prinzip musst du jeweils den Ordinalwert eines zeichens ermitteln, und prüfen, ob der möglich ist. Die Liste müsstest du wohl selbst erstellen ;) |
Re: Überprüfen ob Char ein vernünftiges Zeichen enthält?
soweit war ich auch schon...
aber ich dachte Delphi hat da vllt eine vordefinierte Funktion. :wall:
Delphi-Quellcode:
//edit: @ und € vergessen :oops:
function sinnvoll(c:char):boolean;
const worths='abcdefghijklmnopqrstuvwxyzäöüABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ+-_.,;:''#*~´`ß?=)(/&%$§"!°^<>|\}][{³² @€µáéíóúÁÉÍÓÚàèìòùÀÈÌÒÙ'; begin result:=pos(c,worths)>0; end; //edit2: und das ganze aboschdrofzeugs áé :zwinker:´ die Zeichentabelle von M$ macht das ja auch irgendwie ? |
Re: Überprüfen ob Char ein vernünftiges Zeichen enthält?
Hallo Michael,
nicht Delphi, sondern Windows hat da eine Funktion:
Delphi-Quellcode:
Funktioniert aber nicht mit allen Fonts zuverlässig. Wenn du eine absolut zuverlässige Funktion brauchst, dann wirst du wahrscheinlich die Fonts direkt untersuchen müssen.
// uses Windows;
function GlyphIndex(Canvas: TCanvas; wc: WideChar): Cardinal; var index: Word; flags: Cardinal; begin flags := GGI_MARK_NONEXISTING_GLYPHS; if GetGlyphIndicesW(Canvas.Handle, @wc, 1, @index, flags) = GDI_ERROR then Result := GDI_ERROR else Result := Index; end; Grüße vom marabu |
Re: Überprüfen ob Char ein vernünftiges Zeichen enthält?
@marabu: willst du etwa jeden buchstaben erst auf den canvas malen, um ihn dann zu prüfen ?
@ichbins: dein code wird zwar funktionieren, ist aber ungeschickt implementiert, da das pos jedesmal den gesamten (oder einen teil) des strings durchscannen muss, was sehr lange dauern kann, da du ja jedes zeichen eines strings prüfen musst. am einfachsten prüfst du einfach auf den ordinalwert, oder guckst ob das Zeichen in einer menge enthalten ist
Delphi-Quellcode:
function isAscii(c:char):boolean;
begin // mengenprüfung //result := (c in 'A'..'Z','a'..'z','ä','ö','ü'); // oder per ordinalwert case byte(c) of 32..126, 128..165: result := true; else result := false; end; end; |
Re: Überprüfen ob Char ein vernünftiges Zeichen enthält?
Zitat:
Der OP wollte die Zeichen die nicht darstellbar sind, marabu hat ihm exakt das gegeben. Es wird geprüft ob der angegebene DC eines der Zeichen in einem Unicode string nicht rendern kann. Deine hardcoded Variante ist dagegen etwas plump, schließlich können manche Fonts mehr Zeichen darstellen als andere. ;) |
Re: Überprüfen ob Char ein vernünftiges Zeichen enthält?
hier geht es aber nicht wirklich um fonts...
|
Re: Überprüfen ob Char ein vernünftiges Zeichen enthält?
Hallo gynter,
"darstellbar" und "schwarze Kästchen" sind die Worte von Michael gewesen - das kann ich nur mit dem Font in Verbindung beantworten. Wenn die Font-Resource ordnungsgemäß mitteilt, welche CharCodes sie rendern kann, dann liefert mein Code korrekte Ergebnisse. Manche (ältere) Fonts bieten z.B. für das Euro-Zeichen #128 keinen Glyph an, informieren aber auch nicht darüber. In solch einem Fall liefert GlyphIndex den CharCode zurück, aber gerendert wird der Font Default Character. Canvas als Parameter heißt nicht, dass ich rendere. Die API Funktion erfährt so nur, welchen Font sie untersuchen soll. Wie geschrieben, nicht immer funktioniert das so wie geplant. Sollte ich Michael falsch verstanden haben, dann tut es mir leid. Freundliche Grüße vom marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz