Wertzuweisung an CHAR-Variable
Wertzuweisung an CHAR-Variable
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
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
-
- 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
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/
-
- 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
Dein OS oder Terminal clientguennid 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?

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....
Re: Wertzuweisung an CHAR-Variable
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
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
Re: Wertzuweisung an CHAR-Variable
Wenn du Char-Index basierten Zugriff brauchst bei Unicode ist es afaik am einfachsten, intern mit WideString und WideChar zu arbeiten.guennid hat geschrieben: Heißt das jetzt, dass man den Typ CHAR für unicode vergessen kann?
Wenn es an's Interface geht, umwandeln mit UTF8Encode.
-
- 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
Klar Soweit ich weiß, gibt es dafür den Typ "WideChar".guennid hat geschrieben:Heißt das jetzt, dass man den Typ CHAR für unicode vergessen kann?
"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.
-
- 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
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.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.
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.
Re: Wertzuweisung an CHAR-Variable
Nö, wieso? Vielleicht hätte ich "WideChar-Index" sagen sollen, aber sonst klappt das.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.
-
- 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
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.theo hat geschrieben:Nö, wieso? Vielleicht hätte ich "WideChar-Index" sagen sollen, aber sonst klappt das.
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.
Re: Wertzuweisung an CHAR-Variable
Kann nicht ganz folgen.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.
Wo hat der OP irgendwas von "case" gesagt?
Was meint denn der OP deiner Meinung nach?
Nö, das wandelt WideString nach UTF8 ist also voll Unicode,mschnell hat geschrieben: Jede Code-umwandlung (z.B. UTF8Encode) holt eine locale-Abhängigkeit rein und damit ist das Programm nicht mehr "Unicode-zertifiziert".
-
- 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
Ahhhh! UTF8 ist auch ein multi-Byte Zeichensatz.theo hat geschrieben:Nö, das wandelt WideString nach UTF8 ist also voll Unicode,
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.
-
- 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
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.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.
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.
-
- 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
OOps da habe ich wiedermal schneller getippt als gedachtmarcov hat geschrieben:Es gibt etwa Krapp ueber eine millione unicode Codepoints.

2**32 sind natürlich nicht 64K sondern 4 Giga



-Michael
Re: Wertzuweisung an CHAR-Variable
UTF8 ist escaped, also benötigt für ein Zeichen allenfalls mehrere Bytes. Das ist gut aber schlecht um Index basiert zuzugreifen.mschnell hat geschrieben:AH UTF8 ist auch ein multi-Byte Zeichensatz.theo hat geschrieben:Nö, das wandelt WideString nach UTF8 ist also voll Unicode,
Warum denn dann nicht bei Unicode bleiben, sondern umwandeln ?
-Michael
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.
Re: Wertzuweisung an CHAR-Variable
Also WideChar braucht mehr Speicher, UTF8 braucht mehr Rechenarbeit beim Zugriff einzelner Zeichen.