Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - FPC/Lazarus und UTF8-Strings


Bergmann89 - Mo 14.11.11 04:00
Titel: FPC/Lazarus und UTF8-Strings
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:

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.


jaenicke - 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:

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


Delete - Mo 14.11.11 08:48

Siehe hier: http://www.michael-puff.de/Programmierung/Artikel/Unicode-UTF.shtml


Bergmann89 - 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.


jaenicke - 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 - Mo 14.11.11 19:41

Ah OK. Also muss ich die Zeichen ggf selber auswerden, wenn ich die ma brauch...


jaenicke - 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 - 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.


jaenicke - 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 - 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^^