eine const mit allen Buchstaben: Wie deklarieren?
-
- Beiträge: 28
- Registriert: So 13. Mär 2011, 22:16
- OS, Lazarus, FPC: Ubuntu (L 0.9.28.2-10ubuntu1 FPC 2.4.0)
Re: eine const mit allen Buchstaben: Wie deklarieren?
Hey Leute,
Ich finde es sehr interessant den Ausführungen hier zu folgen^^
Vermutlich sollte ich mich selbst mal etwas genauer mit UTF8 usw auseinandersetzen, damit ich die Problematik besser verstehe, aber grob ists mir schon klar.
Leider wird es noch etwas dauern, bis ich das ganze real testen kann, aber derzeit glaube ich fast, dass u-boots Variante für mich speziell besser geeignet ist. Meine Vermutung zeugt daher, dass theos Funktion mir glaube ich auch ein é oder so als Buchstaben bejahen würde. Ich verwende die Funktion, um daraus Teilnamen von SQLite-Tabellen zu erzeugen und glaube (das werde ich sobald als möglich testen), dass Apostrophe uä nicht verwendet werden dürfen.
Wenn doch, um so besser, dann gebe ich theos Funktionen klar den Vortritt. Wenn das nicht der Fall ist, muss ich schauen und werde warsch u-boots Variante nehmen.
Vielen Dank aber für die Diskussion, es hilft mir deutlich weiter !
Viele Grüße,
SiMoeBoe
Ich finde es sehr interessant den Ausführungen hier zu folgen^^
Vermutlich sollte ich mich selbst mal etwas genauer mit UTF8 usw auseinandersetzen, damit ich die Problematik besser verstehe, aber grob ists mir schon klar.
Leider wird es noch etwas dauern, bis ich das ganze real testen kann, aber derzeit glaube ich fast, dass u-boots Variante für mich speziell besser geeignet ist. Meine Vermutung zeugt daher, dass theos Funktion mir glaube ich auch ein é oder so als Buchstaben bejahen würde. Ich verwende die Funktion, um daraus Teilnamen von SQLite-Tabellen zu erzeugen und glaube (das werde ich sobald als möglich testen), dass Apostrophe uä nicht verwendet werden dürfen.
Wenn doch, um so besser, dann gebe ich theos Funktionen klar den Vortritt. Wenn das nicht der Fall ist, muss ich schauen und werde warsch u-boots Variante nehmen.
Vielen Dank aber für die Diskussion, es hilft mir deutlich weiter !
Viele Grüße,
SiMoeBoe
Woran du glaubst, dafür sollst du leben und sterben.
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: eine const mit allen Buchstaben: Wie deklarieren?
Für "nicht cracks" am einfachsten wohl mit {$codepage utf8} oder -Fcutf8 und UnicodeChar und UnicodeString, nicht ?theo hat geschrieben: Denn Tipp halte ich für nicht besonders gut. Lieber auf Unicode umstellen, es ist ja alles da, statt auf Ansi rumreiten.

Martin
-
- Beiträge: 1102
- Registriert: Di 5. Aug 2008, 09:37
- OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
- CPU-Target: 32/64,PPC(+64), ARM
- Wohnort: Eindhoven (Niederlande)
Re: eine const mit allen Buchstaben: Wie deklarieren?
1. Sets Funktionierendann noch immer nicht. Sie funktionieren in Delphi, aber dass ist auch nicht Ideal.mse hat geschrieben:Für "nicht cracks" am einfachsten wohl mit {$codepage utf8} oder -Fcutf8 und UnicodeChar und UnicodeString, nicht ?theo hat geschrieben: Denn Tipp halte ich für nicht besonders gut. Lieber auf Unicode umstellen, es ist ja alles da, statt auf Ansi rumreiten.![]()
2. Mischen von utf16/Unicodestring und Ansistring ist auch gefährlich, weil der default Encoding von Ansistring wahrscheinlich NICHT utf8 ist. Also durch automatische Konversionen werden String korrupt.
Re: eine const mit allen Buchstaben: Wie deklarieren?
u-boot hat geschrieben: Sollte was an meinem Vorschlag nicht funktionieren, bitte ein 'zulässiges Alphabet' und einen zu überprüfenden string angeben, wo etwas zu einem falschen Ergebnis führt. Dann könnt ich die Kritik nachvollziehn.
Hier: Kommt Ĥ im Alphabet vor? Nein.
Sagt deine Funktion, es käme vor? Ja.
Du kannst sagen, das sei dir egal, aber es ist einfach Gemurkse in Unicode.
Code: Alles auswählen
const gross='ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜĠ';
klein='abcdefghijklmnopqrstuvwxyzöüäß';
alle=gross+klein;
function nurbuchstaben(const s:string):boolean;
var i:integer;
begin
result:=true;
i:=length(s);
while (i>0) and result do if pos(s[i], alle)=0 then result:=false else dec(i);
end;
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
Caption:=BoolToStr(nurbuchstaben('üĤdu'),true);
end;
-
- Beiträge: 308
- Registriert: Do 9. Apr 2009, 10:10
- OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
- CPU-Target: 32Bit
- Wohnort: 785..
Re: eine const mit allen Buchstaben: Wie deklarieren?
Nein ist mir nicht egal. Ist doch ein tolles Beispiel, worauf ich selber wohl nicht gekommen wäre (Ich nehm wohl auch zu selten Buchstaben die nich auf meiner Tastatur sind).theo hat geschrieben:Du kannst sagen, das sei dir egal, aber es ist einfach Gemurkse in Unicode.
Rausgefunden habe ich, dass 'Ġ' und 'ä' zusammen in einem Alphabet das falsche Ergebnis mit dem Ĥ zulassen. Ich werde mir das mal noch näher ansehn.....
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)
-
- Beiträge: 586
- Registriert: Mi 25. Mär 2009, 21:12
- OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
- CPU-Target: mostly 32 bit
Re: eine const mit allen Buchstaben: Wie deklarieren?
Sieht eher nach pascal code ausu-boot hat geschrieben: Ich will hier mal auch noch nen Senf dazugeben.
Apropos Senf: "It doesn't cut it" (Englisch fuer: tut den Job NICHT; und hat was mit Senf zu tun (Google))P.S.: Gerne könnt ihr mir beibringen, wo die Nachteile dieser Lösung liegen.Code: Alles auswählen
const gross='ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ'; klein='abcdefghijklmnopqrstuvwxyzöüß'; alle=gross+klein; while (i>0) and result do if pos(s[i], alle)=0 then result:=false else dec(i);
1) Ist irrsinnig langsam: 2 verschachtelte Schlaufen. Die 1 (set) Lösung, sollte eine art bitmaks fuer dent est nutzen => also schneller sein.
Du kannst obiges auch als set "const klein=['a'..'z', #$C3, #$B6]" schreiben. (Enthält die beiden bytes die ein OE ausmachen.
2) Es funktioniert in soweit, als dass es keine falschen anderen Zeichen Anerkennen wird.
3) Es funktioniert nicht.
weil man OE ach anders encodieren kann, als sequence von 2 unicode Zeichen
prefix with the unicode CC 88̈ COMBINING DIAERESIS (2 punkte über nächsten Zeichen)
CC 88 4F
4) Es funktioniert nicht wenn der Text ein BOM enthaelt, oder andere Steuersequenzen. (OK Steuersequenzen mögen nicht erwünscht sein)
5) Auch wenn es Deutsch ist, in Namen koennen Akzente und andere Sonderzeichen vorkommen.
Re: eine const mit allen Buchstaben: Wie deklarieren?
Ja, das ist richtig. Weil beim Ġ das erste Byte und beim ä das zweite Byte "stimmt" und du Byteweise und keine Sequenzen vergleichst, kommt das Ĥ "durch" obwohl es nicht erlaubt ist.u-boot hat geschrieben: Rausgefunden habe ich, dass 'Ġ' und 'ä' zusammen in einem Alphabet das falsche Ergebnis mit dem Ĥ zulassen. Ich werde mir das mal noch näher ansehn.....
-
- Beiträge: 308
- Registriert: Do 9. Apr 2009, 10:10
- OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
- CPU-Target: 32Bit
- Wohnort: 785..
Re: eine const mit allen Buchstaben: Wie deklarieren?
Nun ich habe mittlerweile etwas zu Unicode gelesen ... es gibt kombinierte Zeichen die auch aus mehr als 2 dingen zusammengesetzt werden. Ok die Verschachtelungstiefe ist nicht so wichtig, wenn man rausbekommt was zu welchem Buchstaben gehört.martin_frb hat geschrieben:3) Es funktioniert nicht.
weil man OE ach anders encodieren kann, als sequence von 2 unicode Zeichen
prefix with the unicode CC 88̈ COMBINING DIAERESIS (2 punkte über nächsten Zeichen)
CC 88 4F
Wobei wir auch schon beim Problem wären was ich nicht lösen konnte.
Wie ist definiert wo die Sequenz für einen Buchstaben anfängt und wo es aufhört ?
Es gibt den Datentyp Unicodechar ... was ist das jetzt bei einem kombinierten Buchstaben: nur ein Teil davon oder passt da ein kombiniertes Zeichen vollständig rein ?
Hat das damit zu tun, dass Werte in sets geordnet werden können (und wahrscheinlich geordnet abgespeichert werden) ?martin_frb hat geschrieben:1) Ist irrsinnig langsam: 2 verschachtelte Schlaufen. Die 1 (set) Lösung, sollte eine art bitmaks fuer dent est nutzen => also schneller sein.
Damit wird die Suche dann natürlich schneller ...
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: eine const mit allen Buchstaben: Wie deklarieren?
???u-boot hat geschrieben:Hat das damit zu tun, dass Werte in sets geordnet werden können (und wahrscheinlich geordnet abgespeichert werden) ?
Damit wird die Suche dann natürlich schneller ...
Sets sind einfach Bitfelder. Jedes mögliche Element eines Sets kann "existieren" (=1) oder nicht (=0). Eine Möglichkeit der "Ordnung" gibt es da nicht. Mathematisch ist die Mengen-Algebra identisch zur Aussagen-Logik. Eine "Menge" kann man sich also also ein ein Feld von logischen Variablen vorstellen.
In Pascal ist ein Set von ['A'.. 'C'] in der Auswirkung dasselbe wie ein Array of Boolean [65..67]. Nur dass es bei Sets eben durch die "Mengenalgebra-Funktionen" praktischerweise "aussagenlogische Funktionen" gibt, die auf alle Elemente gemeinsam ausgeführt werden. (was Computer-technisch natürlich auch effizienter gelöst wird als eine Schleife).
-Michael
Zuletzt geändert von mschnell am So 7. Aug 2011, 14:22, insgesamt 2-mal geändert.
Re: eine const mit allen Buchstaben: Wie deklarieren?
Bin nicht ganz sicher ob ich dich 100%ig verstehe, aber ich sag mal was:u-boot hat geschrieben: Wie ist definiert wo die Sequenz für einen Buchstaben anfängt und wo es aufhört ?
Es gibt den Datentyp Unicodechar ... was ist das jetzt bei einem kombinierten Buchstaben: nur ein Teil davon oder passt da ein kombiniertes Zeichen vollständig rein ?
Bei UTF-8 ist die Länge der Sequenz des Buchstabens im ersten Byte enthalten. Dort hat es ja noch Platz, weil nur die Chars bis 127 benutzt werden.
Die Frage der kombinierten Zeichen hat nicht direkt mit der Speicherei zu tun. Es sind einfach wie zwei Buchstaben, die man aber auch in einem darstellen könnte. Warum es das gibt ist mir auch nicht ganz klar.
Du kannst einen String aber "normalisieren", d.h. in eine "composed" Form bringen, bevor du ihn bearbeitest.
Das geht auch mit der character.pas aus http://wiki.lazarus.freepascal.org/Theodp" onclick="window.open(this.href);return false;
TCharacter.Normalize_NFKC('');
In der Praxis ist das nicht soo wichtig, da die "auseinandergepflückte" Form imho fast nicht vorkommt.
-
- Beiträge: 290
- Registriert: Mo 24. Dez 2007, 13:14
- OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
- CPU-Target: AMD64X2
Re: eine const mit allen Buchstaben: Wie deklarieren?
Falls es euch hilft, ich benutze das um zu prüfen ob ein Zeichen eine Buchstabe ist:
Das funktioniert wunderbar mit Standard Zeichensatz unter Lazarus.
Vielleicht sollte man oben anstatt Ord(Key) eine Funktion nehmen das Unicode-Wert eines Buchstaben zurückliefert und die gängigsten Buchstaben des Lateinischen Alphabets in die Schleife unten Einfügen.
Code: Alles auswählen
function IsBuchstabe(Key: char):Boolean;
var aVal: integer;
begin
aVal:=Ord(key);
case aVal of
65..90, 97..122, 192..255 : Result:=true; //65..90:A..Z, 97..122=a..z, 192..255: Umlaute, Akzente
else Result:=false;
end;
end;
Vielleicht sollte man oben anstatt Ord(Key) eine Funktion nehmen das Unicode-Wert eines Buchstaben zurückliefert und die gängigsten Buchstaben des Lateinischen Alphabets in die Schleife unten Einfügen.
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: eine const mit allen Buchstaben: Wie deklarieren?
Funktioniert mit UTF-8 (was die normale Zeichen-Kodierung beim aktuellen Lazarus ist) aber bestimmt nicht.
Wenn Du das bei Tasten-Inputs verwendest (wie "key" suggeriert), weiß ich nicht wie das da funktioniert (Tasten in char-variablen können nicht UTF-8 sein)
Wenn man den 32-Bit Unicode-Wert eines "Buchstaben" in einem UTF-8 - String bekommen will, muss man die einzelnen Buchstaben in diesem String erstmal finden. Am besten also den ganzen String in UC4 verwandeln lassen, dann die einzelnen Zeichen bearbeiten und hoffen, dass der String nicht von einem Mac kommt und solche bekloppten Zeichenpaare enthält.
-Michael
Wenn Du das bei Tasten-Inputs verwendest (wie "key" suggeriert), weiß ich nicht wie das da funktioniert (Tasten in char-variablen können nicht UTF-8 sein)
Wenn man den 32-Bit Unicode-Wert eines "Buchstaben" in einem UTF-8 - String bekommen will, muss man die einzelnen Buchstaben in diesem String erstmal finden. Am besten also den ganzen String in UC4 verwandeln lassen, dann die einzelnen Zeichen bearbeiten und hoffen, dass der String nicht von einem Mac kommt und solche bekloppten Zeichenpaare enthält.
-Michael
Re: eine const mit allen Buchstaben: Wie deklarieren?
Glaube ich eher nicht.Bora4d hat geschrieben: Das funktioniert wunderbar mit Standard Zeichensatz unter Lazarus.
Aber vor Allem verstehe ich nicht, wieso ihr euch mit mühsamen Scheinlösungen herumschlagen wollt.
Das Problem ist doch Unicode-Tauglich gelöst z.B. in
Code: Alles auswählen
TCharacter.IsLetter()