Wertzuweisung an CHAR-Variable

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
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: Wertzuweisung an CHAR-Variable

Beitrag von marcov »

mschnell hat geschrieben:
Übrigens: wie weist man denn das 5. Zeichen eines Unicode-Strings auf einen WideChar zu ????
c := x[5]; wäre Pascal-Typisch, aber hier müsste der Compiler Code einbauen, der das 5. Zeichen sucht (jedes Zeichen kann ja aus 1, 2, 3 oder 4 Byte bestehen).
Das wird nicht klappen. Es wird einfach zwei Bytes holen auf Offset 5*2. Das wird sich auch nicht ändern. Auch nicht mit TUnicodeString oder in Tiburon.

Und siehe auch meine letzten post, wirklich perfekt mit Unicode umgehen, das es klappt mit alle sprachen is sehr,sehr Aufwändig. Man muss alle Regeln aller Sprachen auswendig kennen, und mit einfach ein array of 32-bit Zeichen wuerde man da noch nicht sein. (Denke auch an was Whitespace ist un was nicht, abbrech Regeln usw. Manche sprachen kan man nicht einfach auf eine Spalten abbrechen, weil der Ausgang von ein Wort beeinflusst wird durch das nächste Wort )

Der Loesing ist einfach: mach eine grosse Unterschied zwischen Strings nur rund pumpen (im GUI sehen lassen, nach dem Konsole ausgeben), und tatsaechlich strings editieren.

Für das Erste sind um und bei keine Kenntnisse der Sprache erforderlich. Fuer das Zweite immer.

Das zweite ist wo Widechar zum nutzen kommt. Wenn mann die Sprache wisst, zb etwas aus Europa, dan kann man schon fast alles im 16-bit machen. Im ersten Fall (nur rundpumpen) soll man aber immer (32-bit) Korrekt sein, dass ist nur eine kleine Mühe, und man kann nie wissen wie ein Projekt sich entwickelt ueber die Jahre.

--------
UTF-8 vs UTF-16

UTF-8: kein Endian Problem
UTF-16,32: Endian Problem

UTF-8: kleiner fuer die meiste Europäische Sprachen (aber nicht Cyrillisch)
fuer manche andere Sprachen (Arabisch, Cyrillisch, Hebräisch) ebenso gross wie UTF-16. ( dies wird oft vergessen, Leute glauben das UTF-16 da auch besser ist)
fuer Indische, Ost Asiatische und mehrere kleinere nicht Europäische Sprachen: UTF-16 ist besser.

UTF-32 fast immer grosser. Es gibt Strings die kleiner sind in UTF-32, aber das sind fast alle tote Sprachen.

UTF-8,UTF-16 : man muss muehe geben um von Zeichen zur Zeichen (eigentlich:Codepoint) zu gehen. Man kann das für Europäischen Sprachen fuer UTF-16 aber ignorieren.
UTF-32: man kann von Codepoint bis Codepoint gehen. Das nutzt aber fast nichts, weil Editieren schwer Sprache abhaengig ist. Und wann mann nicht Editieren kan, was nutzt ueber Zeichen iterieren?
Und fuer Europäische sprachen kann mann das schon mit UTF-16.
Zuletzt geändert von marcov am Mi 17. Sep 2008, 11:52, insgesamt 1-mal geändert.

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: Wertzuweisung an CHAR-Variable

Beitrag von mschnell »

theo hat geschrieben:Also WideChar braucht mehr Speicher, UTF8 braucht mehr Rechenarbeit beim Zugriff einzelner Zeichen.
Heißt das, ein Widechar String besteht aus lauter 32-Bit-Zeichen ?
Ich habe gerade gelesen, dass ein utf8-Zeichen sogar aus bis zu 6 Byte bestehen kann ( http://en.wikipedia.org/wiki/UTF-8" onclick="window.open(this.href);return false; ) (das sind dann aber wohl ganz exotische Zeichen). Man kann es also nicht in einem 32-Bit Wert speichern. Dann müsste man die besagte "case"-Anweisung mit einem 64-Bitz Typ veranstalten.

-Michael

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

Re: Wertzuweisung an CHAR-Variable

Beitrag von theo »

mschnell hat geschrieben: Heißt das, ein Widechar String besteht aus lauter 32-Bit-Zeichen ?
Nein, UCS-2 also nur 16-Bit.
Damit lässt sich aber (in der Praxis) das meiste darstellen (auch Balinesisch, Koreanisch etc.)
Codepunkte über $ffff sind eher von akademischem Interesse: http://www.utf8-chartable.de/" onclick="window.open(this.href);return false;

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

Re: Wertzuweisung an CHAR-Variable

Beitrag von theo »

Zur Veranschaulichung: Beide Varianten geben "aΩz" aus auf GTK2, also ein gr. Omega in der Mitte.
Tabellen von hier http://www.utf8-zeichentabelle.de/unico ... ?start=880" onclick="window.open(this.href);return false;

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
 WCH:WideChar;
 WS:WideString;
 UTFCh, UTF8S:UTF8String;
begin
  UTFCh:=chr($ce)+chr($a9);
  UTF8S:='a'+UTFCh+'z';
 
  WCH:=WideChar($03A9);
  WS:='a'+WCH+'z';
 
  Label1.Caption:=UTF8S;
  Writeln(Length(UTF8S)); // ergibt 4!!
 
  Label2.Caption:=UTF8Encode(WS);
  Writeln(Length(WS)); //ergibt praktischer- und richtigerweise 3
end;

guennid
Beiträge: 59
Registriert: Sa 9. Aug 2008, 10:19

Re: Wertzuweisung an CHAR-Variable

Beitrag von guennid »

Hallo Leute, mit eurer Spezialistendiskussion kann ich nicht mehr so sehr viel anfangen -jedenfalls zur Zeit nicht.
Ich bin auch kein professioneller Entwickler.

Ich habe hier ein ziemlich umfangreiches und ausdifferenziertes Programm in Borland-Pascal für DOS. Das will ich auf linux portieren. Es ist also ein Konsolen-Programm und ich habe mich dafür entschieden, dass es das auch einstweilen bleiben soll. Der Anfang ist gemacht, und das Hauptmenü läuft auch (alle noch nicht funktionierenden Prozeduren und Funktionen sind auskommentiert). Ich bin dabei, die Routinen umzuschreiben, die Fensterrahmen auf den Bildschirm malen. Die entsprechenden Zeichen kriege ich in linux, soweit ich sehe, nur über utf-8, nicht in iso-8859-1/15. Ich kriege die o.a. Rahmenecke auch am Bildschirm ausgegeben, wenn ich sie als Zeichen ins Programm schreibe, aber wenn ich das Zeichen einer CHAR-Variablen zuweise, wird es nicht mehr ausgegeben.

Ich habe auch noch andere Routinen, in denen einzelne Zeichen gehandelt werden.Welchen Typ nehme ich da denn nun für Einzelzeichen. widechar und widestring sind böhmische Dörfer für mich und ich habe auch bisher keine für nicht-Profis anwendungstauglichen Beispiele und Erklärungen gefunden.

MIt dem zwischenzeitlich geposteten Beispiel komme ich nicht klar: Wieder neue Typen, die ich nicht kenne. Es geht mir z.Z. um Einzelzeichen, nicht um Strings - wie immer die auch heißen mögen.

Also nochmal, im dos-pascal-Programm habe ich diesen Code-Schnipsel:

e1 : Char;
e1:=#218; { linke obere Rahmenecke }
gotoxy(5,10);write(e1);

Wie würde das denn nun in free pascal für linux aussehen?

Grüße, Günther

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Wertzuweisung an CHAR-Variable

Beitrag von Christian »

Wiso nimmst du nicht FreeVision für die Oberflächen damit bist du den ganzen ärger los ? Alternativ glaube ich kaum das es mehr aufwand ist die Oberflächen in Lazarus zu baun dann hast du ne "richtige GUI" wird wohl eher weniger aufwand...
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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: Wertzuweisung an CHAR-Variable

Beitrag von mschnell »

guennid hat geschrieben: Das will ich auf linux portieren. Es ist also ein Konsolen-Programm und ich habe mich dafür entschieden, dass es das auch einstweilen bleiben soll. Der Anfang ist gemacht, und das Hauptmenü läuft auch
Ein Kommandozeilen-Programm mit einer selbst gebastelten non-Standard Character-basierten 2-dimensionalen Benutzer-Oberfläche ????

Gar keine gute Idee !!!!

Es ist vermutlich einfacher, die Funktionalen Teile von den Benzuter-Interaktions-Teilen in jeweils in eigene Units abzutrennen und dann die Benzuter-Interaktions-Teile neu in Lazarus zu bauen.
guennid hat geschrieben:e1 : Char;
e1:=#218; { linke obere Rahmenecke }
gotoxy(5,10);write(e1);

Wie würde das denn nun in free pascal für linux aussehen?
Am besten garnicht ;)

-Michael

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

Re: Wertzuweisung an CHAR-Variable

Beitrag von theo »

mschnell hat geschrieben: Am besten garnicht ;)
Schliesse mich der Meinung von mschnell und christian an.
Gerade wenn du nicht viel Ärger haben willst...

guennid
Beiträge: 59
Registriert: Sa 9. Aug 2008, 10:19

Re: Wertzuweisung an CHAR-Variable

Beitrag von guennid »

Christian hat geschrieben:... die Oberflächen in Lazarus zu baun dann hast du ne "richtige GUI" wird wohl eher weniger aufwand...
Und da wiederum bin ich ziemlich skeptisch. Ich habe schon zweimal angesetzt und bin jedesmal sofort gegen die Wand gelaufen. Dass mein Vorhaben ziemlich mühsam wird, glaub ich dir aufs Wort, aber pascal kann ich und sonst nichts. Und ich sehe auch weit und breit kein so gutes Buch für lazarus wie damals der zweibändige Klawun, mit dem ich mir pascal selbst beigebracht habe. Und wie du siehst, bringt mich diese Diskussion hier auch nicht gerade weiter.

Werd' ich mich halt allein durchwursteln müssen - oder dem Schulleiter beibringen müssen, dass ein neuer Rechner und zwei Lizenzen für Vista und littera fällig sind.

Grüße, Günther

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: Wertzuweisung an CHAR-Variable

Beitrag von mschnell »

Was willst Du mit Vista ?!?!?!? Igitt !!!!

Eine Oberfläche in Lazarus zu bauen ist wirklich keine Kunst. Wenn Du Dir ein Einsteiger Buch zu Delphi besorgst kannst Du die Grundlegenden Sachen leicht übertragen. Und hier gibts kompetente Unterstützung. :)

Linux, Lazarus, kost alles nix.

Wenn Du Windows XP (nur ja kein Vista !) auf dem Rechner hast kannst Du natürlich auch die kostenlose "Turbo-Delphi" Version von Borland nehmen. Kost auch nix, hat ein wesentlich besseres Hilfe-System als Lazarus und ein Delphi-Buch kannst Du 1:1 anwenden.

Gruß,

-Michael
Zuletzt geändert von mschnell am Do 18. Sep 2008, 10:11, insgesamt 1-mal geändert.

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: Wertzuweisung an CHAR-Variable

Beitrag von marcov »

guennid hat geschrieben:
e1 : Char;
e1:=#218; { linke obere Rahmenecke }
gotoxy(5,10);write(e1);

Wie würde das denn nun in free pascal für linux aussehen?
Genau dasselbe. Man muss nur Linux gut einstellen, un dasselbe (cp437) font laden. Es ist wie "mode con prepare" auf Dos.

Das einige Problem ist das es under Linux ein unterschied gibt zwischen ein Font setzen auf der textmode Konsole, oder mit ein Konsole program unter X.

Also nicht "utf-8" als Terminal, aber "cp437".

guennid
Beiträge: 59
Registriert: Sa 9. Aug 2008, 10:19

Re: Wertzuweisung an CHAR-Variable

Beitrag von guennid »

@markov
Bleiben wir mal einstweilen auf der "richtigen" Konsole (schwarz-weißer Bildschirm), kein X-Terminal.

Dort soll ich cp437 setzen? Habe ich das richtig verstanden?

Wenn ja, wie soll das gehen? Bei den locales wird mir das nicht angeboten?

Ich glaube auch, dass das eine Sackgasse ist. Ich denke schon, dass es mit den Typen und der Wertzuweisung zusammenhängt.

Es geht nämlich folgendes:

CONST e1='╔'
...
gotoxy(5,10);write(e1);

Aber ich weiß nicht, welcher Typ der Konstanten automatisch zugewiesen wird. Und es nutzt mir nichts, weil ich das Zeichen in einer Variablen, nicht in einer Konstanten brauche. Im weiteren Verlauf gibt's dann auch (logischerweise) Probleme mit CASE-Verzweigungen.

Grüße, Günther

Grüße, Günther

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

Re: Wertzuweisung an CHAR-Variable

Beitrag von theo »

guennid hat geschrieben: Aber ich weiß nicht, welcher Typ der Konstanten automatisch zugewiesen wird. Und es nutzt mir nichts, weil ich das Zeichen in einer Variablen, nicht in einer Konstanten brauche. Im weiteren Verlauf gibt's dann auch (logischerweise) Probleme mit CASE-Verzweigungen.
Da kommst du einfach um die Theorie nicht rum. Auch als "nicht-Profi" (hier ist übrigens kaum einer Profi) und mit Sichtung von böhmischen Dörfern.

Also wenn du es verstehen willst, kann man einen Erklärungsversuch starten. Sonst wäre das Zeitverschwendung.

Antworten