eine const mit allen Buchstaben: Wie deklarieren?

Für Fragen von Einsteigern und Programmieranfängern...
SiMoeBoe
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?

Beitrag von SiMoeBoe »

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
Woran du glaubst, dafür sollst du leben und sterben.

mse
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?

Beitrag von mse »

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.
Für "nicht cracks" am einfachsten wohl mit {$codepage utf8} oder -Fcutf8 und UnicodeChar und UnicodeString, nicht ? ;-)

Martin

marcov
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?

Beitrag von marcov »

mse hat geschrieben:
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.
Für "nicht cracks" am einfachsten wohl mit {$codepage utf8} oder -Fcutf8 und UnicodeChar und UnicodeString, nicht ? ;-)
1. Sets Funktionierendann noch immer nicht. Sie funktionieren in Delphi, aber dass ist auch nicht Ideal.
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.

Benutzeravatar
theo
Beiträge: 10865
Registriert: Mo 11. Sep 2006, 19:01

Re: eine const mit allen Buchstaben: Wie deklarieren?

Beitrag von theo »

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;

u-boot
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?

Beitrag von u-boot »

theo hat geschrieben:Du kannst sagen, das sei dir egal, aber es ist einfach Gemurkse in Unicode.
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).

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)

martin_frb
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?

Beitrag von martin_frb »

u-boot hat geschrieben: Ich will hier mal auch noch nen Senf dazugeben.
Sieht eher nach pascal code aus

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);
P.S.: Gerne könnt ihr mir beibringen, wo die Nachteile dieser Lösung liegen.
Apropos Senf: "It doesn't cut it" (Englisch fuer: tut den Job NICHT; und hat was mit Senf zu tun (Google))

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.

Benutzeravatar
theo
Beiträge: 10865
Registriert: Mo 11. Sep 2006, 19:01

Re: eine const mit allen Buchstaben: Wie deklarieren?

Beitrag von theo »

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.....
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
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?

Beitrag von u-boot »

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
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.
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 ?

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.
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 ...
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

mschnell
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?

Beitrag von mschnell »

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.

Benutzeravatar
theo
Beiträge: 10865
Registriert: Mo 11. Sep 2006, 19:01

Re: eine const mit allen Buchstaben: Wie deklarieren?

Beitrag von theo »

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 ?
Bin nicht ganz sicher ob ich dich 100%ig verstehe, aber ich sag mal was:

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.

Bora4d
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?

Beitrag von Bora4d »

Falls es euch hilft, ich benutze das um zu prüfen ob ein Zeichen eine Buchstabe ist:

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;
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.

mschnell
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?

Beitrag von mschnell »

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

Benutzeravatar
theo
Beiträge: 10865
Registriert: Mo 11. Sep 2006, 19:01

Re: eine const mit allen Buchstaben: Wie deklarieren?

Beitrag von theo »

Bora4d hat geschrieben: Das funktioniert wunderbar mit Standard Zeichensatz unter Lazarus.
Glaube ich eher nicht.
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()
http://wiki.lazarus.freepascal.org/Theodp" onclick="window.open(this.href);return false;

Antworten