uppercase und lowercase

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
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: uppercase und lowercase

Beitrag von mschnell »

theo hat geschrieben: BOM UTF-16 Little Endian: $FF $FE
Danke für die Bestätigung! Finde ich ja eigentlich vernünftig !
Aber Warum schreibt Lazarus die Datei so, wenn im Kontext-Menü des Editors utf8 steht und die Option UCS2 garnicht existiert ?
theo hat geschrieben: ä: dez:228 UCS-2:$00E4 UTF8:$C3 $A4
Ah, in UCS2 sind die deutschen Umlaute analog zu ANSI/west Europa Codepage kodiert. Sehr praktisch :) .

-Michael

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

Re: uppercase und lowercase

Beitrag von theo »

mschnell hat geschrieben: Aber Warum schreibt Lazarus die Datei so, wenn im Kontext-Menü des Editors utf8 steht und die Option UCS2 garnicht existiert ?
Ein Rätsel. Ich bin zwar nicht auf Windows, dachte aber auch dort sei UTF-8 der Laz. Standard.
mschnell hat geschrieben: Ah, in UCS2 sind die deutschen Umlaute analog zu ANSI/west Europa Codepage kodiert. Sehr praktisch :) .
Ja. Eigentlich müsste man sagen bei "Unicode", denn das gilt nat. auch für UCS-4 und UTF-16

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: uppercase und lowercase

Beitrag von mschnell »

- utf8uppercase geht auch nicht :( (In Turbo-Delphi funktioniert's)
- der Typ String ist offensichtlich doch nicht = Widestring.
- das einzige, was In Turbo Delphi nicht funktioniert ist uppercase mit nicht weiter spezifiziertem type "String". Das könnte sogar Absicht sein ....


Neue Version mit stark erweiterten Ausgaben:

Code: Alles auswählen

implementation
uses
  lclproc;
{ TForm1 }
 
 
procedure TForm1.Button1Click(Sender: TObject);
var
  s1, s2, s3: string;
  c1: char;
  i1: Integer;
  su1, su2: UTF8String;
  sw1, sw2: Widestring;
  ss1, ss2: ShortString;
  sa1, sa2: AnsiString;
begin
  s1  := 'abcdefhäöü<';
  sa1 := 'abcdefhäöü<';
 
  sw1 := s1;
  ss1 := s1;
  su1 := AnsiToUtf8(sa1);
 
  s2  := UpperCase(s1);
  sa2 := AnsiUpperCase(sa1);
  su2 := UTF8UpperCase(su1);
  sw2 := WideUpperCase(sw1);
  s3  := sw2;
  ss2 := Uppercase(ss1);
 
  Memo1.Lines.Add('s1 (' + inttostr(length(s1)) + '):');
  Memo1.Lines.Add(s1);
  dump(@s1[1], length(s1));
 
  Memo1.Lines.Add('s2 (' + inttostr(length(s2)) + '):');
  Memo1.Lines.Add(s2);
  dump(@s2[1], length(s2));
 
  Memo1.Lines.Add('s3 (' + inttostr(length(s3)) + '):');
  Memo1.Lines.Add(s3);
  dump(@s3[1], length(s3));
 
  Memo1.Lines.Add('su1 (' + inttostr(length(su1)) + '):');
  Memo1.Lines.Add(su1);
  dump(@su1[1], length(su1));
 
  Memo1.Lines.Add('su2 (' + inttostr(length(su2)) + '):');
  Memo1.Lines.Add(su2);
  dump(@su2[1], length(su2));
 
  Memo1.Lines.Add('sw1 (' + inttostr(length(sw1)) + '):');
  Memo1.Lines.Add(sw1);
  dump(@sw1[1], 2*length(sw1));
 
  Memo1.Lines.Add('sw2 (' + inttostr(length(sw2)) + '):');
  Memo1.Lines.Add(sw2);
  dump(@sw2[1], 2*length(sw2));
 
  Memo1.Lines.Add('ss1 (' + inttostr(length(ss1)) + '):');
  Memo1.Lines.Add(ss1);
  dump(@ss1[1], length(ss1));
 
  Memo1.Lines.Add('ss2 (' + inttostr(length(ss2)) + '):');
  Memo1.Lines.Add(ss2);
  dump(@ss2[1], length(ss2));
 
  Memo1.Lines.Add('sa1 (' + inttostr(length(sa1)) + '):');
  Memo1.Lines.Add(sa1);
  dump(@sa1[1], length(sa1));
 
  Memo1.Lines.Add('sa2 (' + inttostr(length(sa2)) + '):');
  Memo1.Lines.Add(sa2);
  dump(@sa2[1], length(sa2));
 
 
  c1  := s1[1];
  i1 := sizeof(c1);
  Memo1.Lines.Add('-' + ' ' + inttostr(i1));
end;
 
procedure TForm1.dump(p: pointer; l: integer);
var
  pc: ^ANSIchar;
  i: Integer;
  c: ANSIchar;
  s1, s2: String;
begin
  pc := p;
  s1:= '= ';
  s2:= '= ';
  for i := 0 to l-1 do begin
    c := pc^;
    inc(pc);
    if (c > ' ') and (c < AnsiChar($7F)) then begin
      s1 := s1 + c + '   ';
     end else begin
      s1 := s1 +  '#' + IntToStr(ord(c)) + ' ';
    end;
    s2 := s2 + inttohex(ord(c), 2) + ' ';
  end;
  Memo1.Lines.Add(s1);
  Memo1.Lines.Add(s2);
  Memo1.Lines.Add('');
end;
 
 
Und die Ausgabe des Lazarus Programme: 
 
s1 (14):
abcdefhäöü<
= a   b   c   d   e   f   h   #195 #164 #195 #182 #195 #188 <   
= 61 62 63 64 65 66 68 C3 A4 C3 B6 C3 BC 3C 
 
s2 (14):
ABCDEFHäöü<
= A   B   C   D   E   F   H   #195 #164 #195 #182 #195 #188 <   
= 41 42 43 44 45 46 48 C3 A4 C3 B6 C3 BC 3C 
 
s3 (14):
ABCDEFHäöü<
= A   B   C   D   E   F   H   #195 #164 #195 #182 #195 #188 <   
= 41 42 43 44 45 46 48 C3 A4 C3 B6 C3 BC 3C 
 
su1 (20):
abcdefhäöü<
= a   b   c   d   e   f   h   #195 #131 #194 #164 #195 #131 #194 #182 #195 #131 #194 #188 <   
= 61 62 63 64 65 66 68 C3 83 C2 A4 C3 83 C2 B6 C3 83 C2 BC 3C 
 
su2 (20):
ABCDEFHäöü<
= A   B   C   D   E   F   H   #195 #131 #194 #164 #195 #131 #194 #182 #195 #131 #194 #188 <   
= 41 42 43 44 45 46 48 C3 83 C2 A4 C3 83 C2 B6 C3 83 C2 BC 3C 
 
sw1 (14):
abcdefhäöü<
= a   #0 b   #0 c   #0 d   #0 e   #0 f   #0 h   #0 #195 #0 #164 #0 #195 #0 #182 #0 #195 #0 #188 #0 <   #0 
= 61 00 62 00 63 00 64 00 65 00 66 00 68 00 C3 00 A4 00 C3 00 B6 00 C3 00 BC 00 3C 00 
 
sw2 (14):
ABCDEFHäöü<
= A   #0 B   #0 C   #0 D   #0 E   #0 F   #0 H   #0 #195 #0 #164 #0 #195 #0 #182 #0 #195 #0 #188 #0 <   #0 
= 41 00 42 00 43 00 44 00 45 00 46 00 48 00 C3 00 A4 00 C3 00 B6 00 C3 00 BC 00 3C 00 
 
ss1 (14):
abcdefhäöü<
= a   b   c   d   e   f   h   #195 #164 #195 #182 #195 #188 <   
= 61 62 63 64 65 66 68 C3 A4 C3 B6 C3 BC 3C 
 
ss2 (14):
ABCDEFHäöü<
= A   B   C   D   E   F   H   #195 #164 #195 #182 #195 #188 <   
= 41 42 43 44 45 46 48 C3 A4 C3 B6 C3 BC 3C 
 
sa1 (14):
abcdefhäöü<
= a   b   c   d   e   f   h   #195 #164 #195 #182 #195 #188 <   
= 61 62 63 64 65 66 68 C3 A4 C3 B6 C3 BC 3C 
 
sa2 (14):
ABCDEFHäöü<
= A   B   C   D   E   F   H   #195 #164 #195 #182 #195 #188 <   
= 41 42 43 44 45 46 48 C3 A4 C3 B6 C3 BC 3C 
 
- 1
 
 
Die Ausgabe des Turbo-Delphi-Programmes: 
 
s1 (11):
abcdefhäöü<
= a   b   c   d   e   f   h   #228 #246 #252 <   
= 61 62 63 64 65 66 68 E4 F6 FC 3C 
 
s2 (11):
ABCDEFHäöü<
= A   B   C   D   E   F   H   #228 #246 #252 <   
= 41 42 43 44 45 46 48 E4 F6 FC 3C 
 
s3 (11):
ABCDEFHÄÖÜ<
= A   B   C   D   E   F   H   #196 #214 #220 <   
= 41 42 43 44 45 46 48 C4 D6 DC 3C 
 
su1 (14):
abcdefhäöü<
= a   b   c   d   e   f   h   #195 #164 #195 #182 #195 #188 <   
= 61 62 63 64 65 66 68 C3 A4 C3 B6 C3 BC 3C 
 
su2 (14):
ABCDEFHÄÖÜ<
= A   B   C   D   E   F   H   #195 #132 #195 #150 #195 #156 <   
= 41 42 43 44 45 46 48 C3 84 C3 96 C3 9C 3C 
 
sw1 (11):
abcdefhäöü<
= a   #0 b   #0 c   #0 d   #0 e   #0 f   #0 h   #0 #228 #0 #246 #0 #252 #0 <   #0 
= 61 00 62 00 63 00 64 00 65 00 66 00 68 00 E4 00 F6 00 FC 00 3C 00 
 
sw2 (11):
ABCDEFHÄÖÜ<
= A   #0 B   #0 C   #0 D   #0 E   #0 F   #0 H   #0 #196 #0 #214 #0 #220 #0 <   #0 
= 41 00 42 00 43 00 44 00 45 00 46 00 48 00 C4 00 D6 00 DC 00 3C 00 
 
ss1 (11):
abcdefhäöü<
= a   b   c   d   e   f   h   #228 #246 #252 <   
= 61 62 63 64 65 66 68 E4 F6 FC 3C 
 
ss2 (11):
ABCDEFHäöü<
= A   B   C   D   E   F   H   #228 #246 #252 <   
= 41 42 43 44 45 46 48 E4 F6 FC 3C 
 
sa1 (11):
abcdefhäöü<
= a   b   c   d   e   f   h   #228 #246 #252 <   
= 61 62 63 64 65 66 68 E4 F6 FC 3C 
 
sa2 (11):
ABCDEFHÄÖÜ<
= A   B   C   D   E   F   H   #196 #214 #220 <   
= 41 42 43 44 45 46 48 C4 D6 DC 3C 
 
- 1
-Michael

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

Re: uppercase und lowercase

Beitrag von theo »

Bist du sicher, dass du das begriffen hast?

Wenn die IDE mit UTF8 läuft dann ist der Inhalt von:
s1 := 'abcdefhäöü<';
UTF8 codiert. Das kannst du ganz leicht prüfen: Wenn Length(s1) nicht der sichtbaren Anzahl Zeichen entspricht ist es UTF8 (bei Vorhandensein von z.B. Umlauten)
mschnell hat geschrieben: - der Typ String ist offensichtlich doch nicht = Widestring.
Wie kommst du drauf, dass er das sein sollte?

Und bitte komm nicht wieder mit Delphi Kompatibilität. Delphi hat erst mit Version 2009 überhaupt Unicode in der VCL.
Das ist auch nicht wirklich kompatibel mit älteren Versionen.

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: uppercase und lowercase

Beitrag von mse »

mschnell hat geschrieben:- utf8uppercase geht auch nicht :( (In Turbo-Delphi funktioniert's)
Bitte lies doch den Code meines Beitrages von 08:43 etwas genauer.
- der Typ String ist offensichtlich doch nicht = Widestring.
Richtig. string = ansistring wenn mit {$mode objfpc}{$h+} kompiliert.
Delphi 2009 hat string = UnicodeString wobei UnicodeString ein Referenz gezählter 16Bit string ist.
- das einzige, was In Turbo Delphi nicht funktioniert ist uppercase mit nicht weiter spezifiziertem type "String". Das könnte sogar Absicht sein ....
uppercase() berücksichtigt bei Delphi und FPC lediglich die ASCII Zeichen 'a' bis 'z'.
Zuletzt geändert von mse am Di 21. Okt 2008, 13:16, insgesamt 1-mal geändert.

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

Re: uppercase und lowercase

Beitrag von theo »

mse hat geschrieben: uppercase() berücksichtigt bei Delphi und FPC lediglich die ANSI Zeichen 'a' bis 'z'.
äöü.. schon auch, oder nicht?

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: uppercase und lowercase

Beitrag von mschnell »

theo hat geschrieben:Bist du sicher, dass du das begriffen hast?
Ich benutze die Default-Einstellungen und hoffe dass Lazarus sich dann verhält wie Delphi (oder vielleicht sogar "besser"...)
theo hat geschrieben:Wenn die IDE mit UTF8 läuft
Was heißt das ? Ich sehe von utf8 nichts. Die Source. Datei ist (wie besprochen UCS2 codiert)
theo hat geschrieben:dann ist der Inhalt von:
s1 := 'abcdefhäöü<';
UTF8 codiert.
Ist er im Beispiel nicht. Um das zu zeigen habe ich ja die Dumps eingebaut.
theo hat geschrieben:
mschnell hat geschrieben: - der Typ String ist offensichtlich doch nicht = Widestring.
Wie kommst du drauf, dass er das sein sollte?
Ich hatte gedacht, dass dadurch die Verwirrung gestiftet wird, weil "String" sich eben nicht mehr so verhält wie in der Vor-Version. War wohl ein Irrtum...
Jedenfalls zeigt des ASM-Code des Beispiels (mit Default-Einstellungen übersetzt) dass der Type String dasselbe wie ANSIString ist.
-Michael
Zuletzt geändert von mschnell am Di 21. Okt 2008, 13:26, insgesamt 1-mal geändert.

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

Re: uppercase und lowercase

Beitrag von theo »

Also mir kommt das seltsam vor.
Ich bin zwar selber nicht auf Windows, dachte aber, dass das mit Lazarus 0.9.26 alles auf UTF8 Umgestellt ist:
http://wiki.lazarus.freepascal.org/Laza ... or_changes" onclick="window.open(this.href);return false;

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: uppercase und lowercase

Beitrag von mse »

theo hat geschrieben:
mse hat geschrieben: uppercase() berücksichtigt bei Delphi und FPC lediglich die ASCII Zeichen 'a' bis 'z'.
äöü.. schon auch, oder nicht?
Nein. äöü.. sind keine ASCII Zeichen.
Sorry ANSI sollte ASCII heissen.

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

Re: uppercase und lowercase

Beitrag von theo »

mse hat geschrieben: Nein. äöü.. sind keine ASCII Zeichen.
Sorry ANSI sollte ASCII heissen.
Stimmt, aber AnsiUpperCase sollte dies tun.

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: uppercase und lowercase

Beitrag von mse »

theo hat geschrieben:
mse hat geschrieben: Nein. äöü.. sind keine ASCII Zeichen.
Sorry ANSI sollte ASCII heissen.
Stimmt, aber AnsiUpperCase sollte dies tun.
Ja, ist aber viel langsamer.

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: uppercase und lowercase

Beitrag von mschnell »

theo hat geschrieben:Also mir kommt das seltsam vor.
Ich bin zwar selber nicht auf Windows, dachte aber, dass das mit Lazarus 0.9.26 alles auf UTF8 Umgestellt ist:
http://wiki.lazarus.freepascal.org/Laza ... or_changes" onclick="window.open(this.href);return false;
Die schreiben: "Lazarus 0.9.26: Encoding used for strings in the LCL is UTF8"
Was soll im Detail das überhaupt heißen ?
Der in einer Unit erzeugte Code nimmt keine Rücksicht auf die Codierung der Strings. z.B. Die Berechnung der Länge eines Strings und der Position eines Zeichen im String ist weiterhin in Einheiten "8-Bit Bytes" und nicht in utf8-Multibyte Zeichen.
In meinem Beispiel wirf für "s: String; s:=UpperCase(s)" SYUTILS_UPPERCASE$ANSISTRING$$ANSISTRING aufgerufen, also offensichtlich nicht eine Funktion die eine utf8-Kodierung berücksichtigt. Idiotischerweise wird "s: ANSISString; s:=ANSIUpperCase(s)" völlig anders übersetzt und ruft U_SYSTEM_WEIDESTRINGMANAGER+28 auf. Keine Ahnung was das tut ....

-Michael
Zuletzt geändert von mschnell am Di 21. Okt 2008, 14:01, insgesamt 1-mal geändert.

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

Re: uppercase und lowercase

Beitrag von theo »

Ja, trotzdem ist alles was du an die Controls schickst und von den Controls ausliest (z.B. TEdit) UTF-8 codiert.
Das gilt auch für den IDE-Editor!!!
Das heisst aber offenbar nicht, dass nun für UTF8String (=Ansistring!!) automatisch die UTF8 Funktionen angewendet werden.

Ich mache es für mich einfach so, dass alles was mit den Controls kommuniziert von/nach WideString übersetzt wird.
Intern brauche ich nur WideString (UCS-2)

Das ist das, was ich dir schon lange zu erklären versuche: Interpretiere nicht zuviel in die Datentypen.
Ein AnsiString ist ein besseres Array of Char. Weiter nichts. Ein UTF8String ist ein Synonym dazu.
Wenn ich mich nicht irre, kennt der Compiler intern den UTF8String nicht mal. Dieser ist in systemh.inc definiert, während AnsiString im Compiler "eingebaut" ist.
Zuletzt geändert von theo am Di 21. Okt 2008, 14:11, 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: uppercase und lowercase

Beitrag von mschnell »

theo hat geschrieben:Das ist das, was ich dir schon lange zu erklären versuche: Interpretiere nicht zuviel in die Datentypen.
Du willst mir also erklären, dass ich nicht nach einer Erklärung suchen soll :) :) :)
Ich würde aber doch schon gerne verstehen, was das System mit dem Code tut, den ich schreibe, um den Code möglichst so zu schreiben, dass das System das tut, was ich möchte dass es tut.

-Michael

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

Re: uppercase und lowercase

Beitrag von theo »

Ja, klar.
Mhh, nur so nebenbei, was war eigentlich genau dein Problem? Vielleicht gehen wir besser mal von was konkretem aus.. ;-)

Antworten