Autor Beitrag
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Mo 14.11.11 04:00 
Hey,

ich bin grad relativ heufig mit Lazarus unterwegs (wie vlt einige schon bemerkt haben) und mir ist wieder etwas aufgefallen, das ich mir nicht erklären kann. Und zwar benutzt Lazarus ja standardmäßig UTF8-Strings (wurde mir mal gesagt). Heißt wenn ich einen str: String mach is der UTF8. Also sollte doch auch SizeOf(Char) = 2 Byte sein, richtig? Ist es aber nicht. Zum test hab ich das ganze nochma über einen FileStream auf die Platte raus geschoben und da kommt der String aber so an, wie ich ihn vorher im Programm definiert habe:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.FormCreate(Sender: TObject);
var
  str: String;
  Stream: TFileStream;
begin
  Stream := TFileStream.Create(Application.ExeName+'test.txt', fmCreate);
  try
    str := 'test νξοπρ';  //hier stehen in meinem Editor die Zeichen, nicht der Bytecode (siehe unten)
    Edit1.Text := str + ' ' + IntToStr(SizeOf(char));
    Stream.Write(str[1], SizeOf(char)*Length(str));
  finally
    Stream.Free;
  end;
end;

Text im Edit: "test νξοπρ 1" (ohne ")
Text in Datei: "test νξοπρ" (ohne ")

Kann mir das jmd erkären?!

MfG Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 14.11.11 08:22 
user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:
Also sollte doch auch SizeOf(Char) = 2 Byte sein, richtig?
UTF-8 hat ja nicht immer 2 Byte pro Zeichen. Ein Unicodezeichen sind in UTF-8 daher ggf. zwei Zeichen. Probier einfach mal das in deinem Code:
ausblenden Delphi-Quelltext
1:
2:
ShowMessage(IntToStr(Length(Str)));
ShowMessage(str[7]);
Wahrscheinlich kommen 15 (10 Zeichen plus 5 Unicodezeichen) und ein nicht lesbares Zeichen heraus. (Kanns auf dem Handy grad schlecht testen.)
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 14.11.11 08:48 
Bergmann89 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Mo 14.11.11 19:20 
Hey,

@jaenicke: ja hast recht. Länge is 15 und das 7. Zeichen wird nicht angezeigt.
@Luckie: Das hatte ich mir bei Wikipedia schon durchgelesen und auch verstanden. Das einzige was ich mir nicht erklären kann ist, warum SizeOf(str[7]) = 1 ist. weil das müssten ja mindesten 2 Byte sein, oder?

MfG Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 14.11.11 19:32 
user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:
Das einzige was ich mir nicht erklären kann ist, warum SizeOf(str[7]) = 1 ist. weil das müssten ja mindesten 2 Byte sein, oder?
Nein, denn str[7] ist der zweite Teil von ν, deinem sechsten Zeichen, str[8] + str[9] ergeben das ξ usw.

Das ist in Lazarus nicht so einfach wie mit Unicode in Delphi. ;-)
Bergmann89 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Mo 14.11.11 19:41 
Ah OK. Also muss ich die Zeichen ggf selber auswerden, wenn ich die ma brauch...

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 14.11.11 20:41 
Gibt es in Lazarus vielleicht auch den Typ WideString? Sonst doch vermutlich zumindest PWideChar. Aber wie das dann auf anderen Plattformen als Windows aussieht, weiß ich nicht.
Bergmann89 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Mo 14.11.11 23:10 
Hey,

WideString, WideChar, PWideString und PWideChar sin alle vorhanden^^ Aber was solln mir die nützen? Der normale String ist doch schon WideString, oder?

MfG Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 15.11.11 00:06 
Nein, WideString wird unter Windows über COM vom System verwaltet. Und via WideChar bzw. PWideChar solltest du auch direkte Unicodezeichen haben, auch unter Lazarus. Oder was ist dort SizeOf(PWideChar^) sonst? Sicher doch 2, oder?
Bergmann89 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Di 15.11.11 10:34 
Jap, WideChar is 2 Byte lang. Alles klar, da weiß ich erstma bescheid, danke für die kleine Nachhilfestunde^^

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^