Wertzuweisung an CHAR-Variable

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
guennid
Beiträge: 59
Registriert: Sa 9. Aug 2008, 10:19

Wertzuweisung an CHAR-Variable

Beitrag von guennid »

Also
Zeichensatz ist utf8.
e1 : CHAR;

e1 := #102

bringt wie von borland gewohnt ein 'f',

aber e1 := #218

bringt '' und nicht '┌'

Was versteh ich da nicht?

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 »

Char ist eine 1-byte variable und bleibt das auch wenn du unicode benutzen willst musst du einen wide oder ansistring nehmen
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

marcov
Beiträge: 1103
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:Also
Zeichensatz ist utf8.
e1 : CHAR;

e1 := #102

bringt wie von borland gewohnt ein 'f',

aber e1 := #218

bringt '' und nicht '┌'

Was versteh ich da nicht?
Dein OS oder Terminal client :-)

Was fuer ein Char daraus kommt ist nicht nur einer sache von FPC, aber auch von terminal Interpreter und Font. FPC wird zeichen #218 nach den Konsole schreiben (kann man controlieren mit strace/ktrace), aber wie die Konsole das wiedergibt....

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

Re: Wertzuweisung an CHAR-Variable

Beitrag von guennid »

Diese Typen wide- oder ansistring kenne ich noch nicht. Wo kann ich mich da schlau machen? Mein Pascal-Handbuch von Klämpfl ist noch die alte Auflage, und da werden die noch nicht beschrieben.

Heißt das jetzt, dass man den Typ CHAR für unicode vergessen kann?

Habe ich dann ein ziemlich dickes Problem bei meinen Routinen für die Eingabe und Behandlung einzelner Zeichen?

Grüße Günther

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

Re: Wertzuweisung an CHAR-Variable

Beitrag von theo »

guennid hat geschrieben: Heißt das jetzt, dass man den Typ CHAR für unicode vergessen kann?
Wenn du Char-Index basierten Zugriff brauchst bei Unicode ist es afaik am einfachsten, intern mit WideString und WideChar zu arbeiten.
Wenn es an's Interface geht, umwandeln mit UTF8Encode.

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:Heißt das jetzt, dass man den Typ CHAR für unicode vergessen kann?
Klar Soweit ich weiß, gibt es dafür den Typ "WideChar".

"Normale" Variablen vom Typ char Variablen sind 8 bit, diese werden (nicht vom Programm, sondern vom Betriebssystem bei der Darstellung) entsprechend einer Zeichensatz-Tabelle (maximal 256 verschiedene Zeichen) interpretiert, und diese ist - neben der Art des Betriebssystems - abhängig von der "locale"-Einstellung.

Unicode Zeichen haben bis zu 32 Bit und sind deshalb im Typ Char nicht speicherbar. Sie werden bei der Darstellung anhand einer (soweit ich weiß) allgemeingültigen (Betriebssystem und locale-unabhängigen) Zeichentabelle (viele tausend Zeichen, aber keine 64K, weil einige Bit-Kombinationen ausgeschlossen sind um auch 8, 16 und 24-Bit Zeichen zu ermöglichen) dargestellt.

Die Umstellung eines Programms auf Unicode kann alles andere als trivial sein.

In der Free-Pascal Developer Mailing-Liste ist eine riesige Diskussion darüber im Gange.

-Michael
Zuletzt geändert von mschnell am Mi 17. Sep 2008, 10:59, insgesamt 3-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:Wenn du Char-Index basierten Zugriff brauchst bei Unicode ist es afaik am einfachsten, intern mit WideString und WideChar zu arbeiten.
Wenn es an's Interface geht, umwandeln mit UTF8Encode.
Damit ist die Unicode-Kompatibilität des Programms dahin: Es wird wieder Betriebssystem- und Locale- abhängig. Das ist wohl kaum der Sinn der Sache.

Für eine Unicode-compatible case-Anweisung muss man (vermutlich) den Unicode-Character einer 32-Bit Variable (Typ "WideChar") zuweisen und die case Anweisung darauf anwenden.

-Michael
Zuletzt geändert von mschnell am Mi 17. Sep 2008, 11:00, insgesamt 1-mal geändert.

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

Re: Wertzuweisung an CHAR-Variable

Beitrag von theo »

mschnell hat geschrieben: Damit ist die Unicode-Kompatibilität des Programms dahin: Es wird wieder Betriebssystem- und Locale- abhängig. Das ist wohl kaum der Sinn der Sache.
Nö, wieso? Vielleicht hätte ich "WideChar-Index" sagen sollen, aber sonst klappt das.

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:Nö, wieso? Vielleicht hätte ich "WideChar-Index" sagen sollen, aber sonst klappt das.
OK, wenn Du meinst, die WiideChar Variable im Case zu benutzen, sind wir uns natürlich einig. Aber das meinte der OP mit seiner Frage wohl nicht.
Jede Code-umwandlung (z.B. UTF8Encode) holt eine locale-Abhängigkeit rein und damit ist das Programm nicht mehr "Unicode-zertifiziert".

Ü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).

-Michael
Zuletzt geändert von mschnell am Mi 17. Sep 2008, 11:09, insgesamt 2-mal geändert.

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

Re: Wertzuweisung an CHAR-Variable

Beitrag von theo »

mschnell hat geschrieben: OK, wenn Du meinst, die WiideChar Variable im Case zu benutzen, sind wir uns natürlich einig. Aber das meinte der OP mit seiner Frage wohl nicht.
Kann nicht ganz folgen.
Wo hat der OP irgendwas von "case" gesagt?
Was meint denn der OP deiner Meinung nach?
mschnell hat geschrieben: Jede Code-umwandlung (z.B. UTF8Encode) holt eine locale-Abhängigkeit rein und damit ist das Programm nicht mehr "Unicode-zertifiziert".
Nö, das wandelt WideString nach UTF8 ist also voll Unicode,

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:Nö, das wandelt WideString nach UTF8 ist also voll Unicode,
Ahhhh! UTF8 ist auch ein multi-Byte Zeichensatz.
Warum denn dann nicht bei Unicode bleiben, sondern umwandeln ?
-Michael
Zuletzt geändert von mschnell am Mi 17. Sep 2008, 11:16, insgesamt 2-mal geändert.

marcov
Beiträge: 1103
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:
Unicode Zeichen haben bis zu 32 Bit und sind deshalb im Typ Char nicht speicherbar. Sie werden bei der Darstellung anhand einer (soweit ich weiß) allgemeingültigen (Betriebssystem und locale-unabhängigen) Zeichentabelle (viele tausend Zeichen, aber keine 64K, weil einige Bit-Kombinationen ausgeschlossen sind um auch 8, 16 und 24-Bit Zeichen zu ermöglichen) dargestellt.
Es gibt etwa Krapp ueber eine millione unicode Codepoints. Ein Zeichen (etwas dass man kan Drucken) kann auch noch aus mehrere Codepoints hergestellt werden. (zb Sprachen die Lesezeichen im letzte Zeichen einer Satz einblenden als Akzente). Ein Widechar kann glaub ich nur etwa 40 tauzend code halten im UTF16. (die ueberige 20k Zeichen sind User und Spezialzeichen und reserverierten Ranges), also da fehlen etwa 950000 Möglichkeiten.

Also, im Unicode-Definition sind Codepoints etwa "logische Zeichen", und Characters (Zeichen) druckbare Zeichen.

Und da gibts noch VIEL mehr Elend. Zb Saetze die Mehrsprachig sind, und einer der Sprachen ist Links-nach-Rechts, und Teile sind in einer Rechts-nach-Links Sprache geschrieben: Er sagt: "etwas Arabisch hier". Groß und Kleinzeichen sind etwas was nur im Westen existiert usw.

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 »

marcov hat geschrieben:Es gibt etwa Krapp ueber eine millione unicode Codepoints.
OOps da habe ich wiedermal schneller getippt als gedacht ;)
2**32 sind natürlich nicht 64K sondern 4 Giga ;) ;) ;).

-Michael

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

Re: Wertzuweisung an CHAR-Variable

Beitrag von theo »

mschnell hat geschrieben:
theo hat geschrieben:Nö, das wandelt WideString nach UTF8 ist also voll Unicode,
AH UTF8 ist auch ein multi-Byte Zeichensatz.
Warum denn dann nicht bei Unicode bleiben, sondern umwandeln ?
-Michael
UTF8 ist escaped, also benötigt für ein Zeichen allenfalls mehrere Bytes. Das ist gut aber schlecht um Index basiert zuzugreifen.
WideChar ist ein DoubleByte und kann deshalb besser zugegriffen werden.
Zuletzt geändert von theo am Mi 17. Sep 2008, 11:19, insgesamt 1-mal geändert.

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

Re: Wertzuweisung an CHAR-Variable

Beitrag von theo »

Also WideChar braucht mehr Speicher, UTF8 braucht mehr Rechenarbeit beim Zugriff einzelner Zeichen.

Antworten