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 νξοπρ'; 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
Bergmann89 hat folgendes geschrieben : |
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.)
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
Bergmann89 hat folgendes geschrieben : |
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^^
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!