utf8 und Umlaute, Sonderzeichen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
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: utf8 und Umlaute, Sonderzeichen

Beitrag von Christian »

WideString ist doch aber nicht aus Widechar aufgebaut oder ? Ich erinenr mich Grau das Marco mal gesagt hast Widestring funktioniert nicht...
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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

Re: utf8 und Umlaute, Sonderzeichen

Beitrag von theo »

Christian hat geschrieben:WideString ist doch aber nicht aus Widechar aufgebaut oder ? Ich erinenr mich Grau das Marco mal gesagt hast Widestring funktioniert nicht...


Woraus denn sonst?
Widestring:=WideChar funzt 100pro. Sonst wäre das Leben ja ziemlich kompliziert.

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

Re: utf8 und Umlaute, Sonderzeichen

Beitrag von guennid »

Aha, stelle fest, die Experten sind auch ein wenig ratlos :mrgreen:

Unter DOS funktioniert Case nur im ein byte-Bereich, das weiß ich definitiv, nix mit word!

Grüße, Günther

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

Re: utf8 und Umlaute, Sonderzeichen

Beitrag von theo »

guennid hat geschrieben:Aha, stelle fest, die Experten sind auch ein wenig ratlos
Nur die einen... ;-)
guennid hat geschrieben: Unter DOS funktioniert Case nur im ein byte-Bereich, das weiß ich definitiv, nix mit word!
Was heisst das denn? Das hängt wohl kaum vom Betriebssystem ab, was der Compiler da macht.

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: utf8 und Umlaute, Sonderzeichen

Beitrag von marcov »

Christian hat geschrieben:WideString ist doch aber nicht aus Widechar aufgebaut oder ? Ich erinenr mich Grau das Marco mal gesagt hast Widestring funktioniert nicht...


Das Functioniert, aber ist eine 16-bits Werte. (64k Werte wovon 62k nutzbar, die andere 2k sind fuer Surrogate escapes forgesehen).
Das ist nicht anders dann das utf8string ein char ist (8-bits werte wovon +/- 128 nutzbar, die andere 128 sind fuer Surrogate escapes forgesehen).

In andere Worte: sowohl für utf8string als widestring (und unicodestring in die Zukunft) gibt [] nicht dem volle Unicode bereich. Natuerlich ist der Bereich für widestring/unicodestring praktischer als die 127 unterschiedliche Zeichen für ein utf8-in-ansistring die mann sicher mit [] verwenden kann.

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

Re: utf8 und Umlaute, Sonderzeichen

Beitrag von theo »

marcov hat geschrieben: (64k Werte wovon 62k nutzbar, die andere 2k sind fuer Surrogate escapes forgesehen).
Bist du sicher? Wie erkenne ich das?
Ich habe keine Probleme mit GTK2 z.B. den obersten Range auszugeben:

Code: Alles auswählen

var awc:WideString;
begin
  awc:=WideChar($FFFD); 
  Label1.Caption:=UTF8Encode(awc);
end;
Also z.B.
U+FFFC  ef bf bc OBJECT REPLACEMENT CHARACTER
U+FFFD � ef bf bd REPLACEMENT CHARACTER

wird bei mir ohne weiteres via WideChar/WideString in UTF8 umgewandelt und angezeigt.

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: utf8 und Umlaute, Sonderzeichen

Beitrag von marcov »

theo hat geschrieben:
marcov hat geschrieben: (64k Werte wovon 62k nutzbar, die andere 2k sind fuer Surrogate escapes forgesehen).
Bist du sicher? Wie erkenne ich das?
Ich habe keine Probleme mit GTK2 z.B. den obersten Range auszugeben:
Die oberen Regionen sind ueber 64k! Ich weiss nicht wie wichtig diese sind. Die meisten oberen Codepoints sind von verstorbene Sprachen. Die Mathematische und Musik symbolen konnten aber nutzlich sein, und ich weiss nicht ob die hohe CJK Symbolen (http://unicode.org/roadmaps/sip/" onclick="window.open(this.href);return false;) wirklich im Brauch sein, oder nur fuer Literatur studien.

Und die 2k die vom BMP die nicht nutzbar sind aber also auch so reserviert in unicode. Das ist die D800-DFFF range, siehe http://unicode.org/roadmaps/bmp/index.html" onclick="window.open(this.href);return false;, da kann man auch sehen das vor E000-F8FF keine standardisierten Karakter gemapt sind.

Also man kan mit UCS2 (UTF-16 ohne Surrogates) nur 64k - 2k (D800-DFFF) - 6k (E000-F7FF) - 256 (F800-F8FF) = 57,75k standardisierte Codepoints erreichen.

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

Re: utf8 und Umlaute, Sonderzeichen

Beitrag von theo »

Ok, die sind ja auch so eingetragen: http://www.utf8-zeichentabelle.de/unico ... tart=55296" onclick="window.open(this.href);return false;
Das bedeutet für mich in der Praxis aber trotzdem, das WideChar/WideString ohne Tricks und Kopfschmerzen ausreicht um z.B. einen Unicode-fähigen Editor zu schreiben.
Ich glaube den Bereich über $FFFF kann man für eine "normale" Anwendung ignorieren. Ich kenne z.B. auch keine Fonts für diesen Bereich.

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: utf8 und Umlaute, Sonderzeichen

Beitrag von marcov »

theo hat geschrieben:Ok, die sind ja auch so eingetragen: http://www.utf8-zeichentabelle.de/unico ... tart=55296" onclick="window.open(this.href);return false;
Das bedeutet für mich in der Praxis aber trotzdem, das WideChar/WideString ohne Tricks und Kopfschmerzen ausreicht um z.B. einen Unicode-fähigen Editor zu schreiben.
Ich glaube den Bereich über $FFFF kann man für eine "normale" Anwendung ignorieren. Ich kenne z.B. auch keine Fonts für diesen Bereich.
(Ich glaube Ost Asien Windows XP Versionen und das Vista versionen mit eine Ost Asien locale installiert diese haben. Die freie OSen haben oft diese Fonts auch schon, weiss nicht von OS X)

Aber das wichtigigere ist das man dann wieder eine gefährlichen Vereinfachung macht. Und die kann in ein paar Jahre Problemen mache.

Fuer mich, und fuer Free Pascal versuche alles was man wiederbrauchen kann, wie Widgets, Bibliotheke und Frameworks in Prinzip Unicode compliant (also >$FFFF supported), aber spar mir den Aufwand für reine Business Code.

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

Re: utf8 und Umlaute, Sonderzeichen

Beitrag von theo »

marcov hat geschrieben: Fuer mich, und fuer Free Pascal versuche alles was man wiederbrauchen kann, wie Widgets, Bibliotheke und Frameworks in Prinzip Unicode compliant (also >$FFFF supported), aber spar mir den Aufwand für reine Business Code.
Genau so sehe ich das auch.
Ich denke auch, dass Unicode-Support für Anwendungen durchaus graduell sein kann.
"Komplikationsstufen" können z.B. sein
- Latin, Cyrilic .. (LtoR)
- Hebrew, Arabic.. (RtoL), Bidirektionaler Text
- Asiatisch (speziell?)
- Zeichen > $FFFF
etc.

Man muss ja nicht gleich alles machen, sonst wird es zu kompliziert und man wird gar nie fertig ;-)

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

Re: utf8 und Umlaute, Sonderzeichen

Beitrag von guennid »

Und wieder einmal kann ich euch teilweise nicht folgen. Ich weiß nicht, was "$FFFF" oder
"E000-F8FF" ist. Ist das so'n Hexadezimal-Kram? Habe ich bisher nicht gebraucht.

Was sagt ihr zu diesem Beispiel:

Code: Alles auswählen

program widechartest;
uses crt,strings;
 
var
myChar : WideChar;
anzahl : BYTE;
 
FUNCTION whs(wh_c:WIDECHAR;wh_max:BYTE) : WIDESTRING;
{bildet einen Wiederholungsstring aus einem Zeichen}
VAR
  wh_tmp_kette : WIDESTRING;
  wh_zaehl : BYTE;
 
BEGIN
wh_tmp_kette := '';
FOR wh_zaehl := 1 TO wh_max DO
  wh_tmp_kette := wh_tmp_kette+wh_c;
whs := UTF8ENCODE(wh_tmp_kette);
END;                         {F. whs}
 
begin
clrscr;
  myChar := UTF8DECODE('═')[1]; anzahl := 29;
  gotoxy(2,12);write(whs(myChar,anzahl));writeln;
end.
Bis anzahl := 27 wird eine doppelte Linie in Zeile 12 gezeichnet. Ab 28 erfolgt ein Zeilenumbruch in der Ausgabe. Was ist falsch?

Grüße, Günther

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: utf8 und Umlaute, Sonderzeichen

Beitrag von monta »

guennid hat geschrieben:Und wieder einmal kann ich euch teilweise nicht folgen. Ich weiß nicht, was "$FFFF" oder
"E000-F8FF" ist. Ist das so'n Hexadezimal-Kram? Habe ich bisher nicht gebraucht.
Das ist der Beginn der entsprechenden Codebereiche (2 Hexadezimale Bytes)... was bspw. E000 für ein Bereich ist, steht hier:
http://www.unicode.org/charts/charindex.html" onclick="window.open(this.href);return false;
Johannes

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

Re: utf8 und Umlaute, Sonderzeichen

Beitrag von theo »

http://de.wikipedia.org/wiki/Hexadezimalsystem" onclick="window.open(this.href);return false;

Hexadezimal $FFFF entspricht dezimal 65535

Weil in der Computerei halt immer mit Bytes gearbeitet wird, sieht die Hex Form einfach klarer aus.
Der höchste Wert in einem Byte ist 255 und der eines Word (wie WideChar) 65535.
Das sieht aber "zufällig" aus, weil es nicht den zugrundeliegenden Einheiten entspricht, und ich kann mir das High(Word) in Dez. auch nicht merken.
In Hexadezimal ist es einfach $FF bzw. $FFFF.

Ich nehme an, dass man historisch das Byte (8bit) als Grundeinheit nahm um alle nötigen Zeichen darzustellen.
Ich lese gerade das historisch ein "Zeichen" auch aus weniger Bits bestehen kann:
bei Telex: 1 Zeichen = 5 Bit
bei ASCII: 1 Zeichen = 7 Bit
bei IBM-PC: 1 Zeichen = 8 Bit = 1 Byte = 1 Oktett

Das ist also genauso willkürlich wie das Dezimalsystem (10 Finger).

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

Re: utf8 und Umlaute, Sonderzeichen

Beitrag von guennid »

Leute, sagt mir doch um Gottes Willen mal, wie ich ein solches Sonderzeichen wiederholt in eine Bildschirmzeile schreibe, am besten in irgendeiner string-Form. Irgendwie funktioniert wohl auch die Funktion "Write()" nicht DOS-üblich.

Beispiel:
Ich weiß mittlerweile, dass man dieses Zeichen: "┌" einer WIDECHAR-Variablen mittels #226#148#140 zuweisen kann. also:
meinC := #226#148#140;
for zaehl := 5 to 55 do begin
gotoxy(zaehl,12);write(meinC);
end;
funktioniert nicht,

für
meinC := 'a';
funktioniert das aber sehr wohl.

meinC := #226#148#140
for zaehl := 5 to 55 do begin
gotoxy(zaehl,12);writeln(meinC);
end;

funktioniert dagegen. Das kann's doch eigentlich nicht sein! Wer erklärt mir das Gewürge?

Eigentlich brauchte ich das Zeichen aber (wiederholt) in einem String und dazu habe ich noch gar keine Möglichkeit gefunden, den in einer Zeile auszugeben.

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: utf8 und Umlaute, Sonderzeichen

Beitrag von mschnell »

guennid hat geschrieben: gotoxy(zaehl,12);writeln(meinC);
Ich vermute, writeln kann Widestring überhaupt nicht richtig bearbeiten. Vermutlich ist das total der falsche Ansatz.

-Michael

Antworten