String-Typen: UTF-32 und Streams

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Joz
Beiträge: 40
Registriert: Mo 27. Mai 2013, 13:16
OS, Lazarus, FPC: Arch Linux, OpenSuse 13.2, Lazarus 1.4
CPU-Target: AMD64
Wohnort: Berlin

String-Typen: UTF-32 und Streams

Beitrag von Joz »

Hallo,
Ich habe eine Menge Strings, die ich gerne in einer (binären) Datei speichern möchte. Ich würde hier gerne mindestens zum Teil UTF32 nehmen.
Meine beiden Fragen:
1. Wie heißt der UTF32-Datentyp? In der Unit System oder auch in LCLProc hab ich nichts gefunden, welche Unit muss ich nehmen?
2. Bei UTF-32 ist die Zeichengröße ja fest (oder?) bei 4 Byte. Wie speichere ich aber UTF-8 in einem Stream? Soll ich vielleicht auch hier 4 Byte nehmen? (Dann würd ich aber überall UTF-32 wählen)
Grammatisch gesehn waren das jetzt zwar mehr als zwei Fragen, aber naja.

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

Re: String-Typen: UTF-32 und Streams

Beitrag von theo »

1. Es gibt einen UCS4String
2. Die zweite Frage ist unklar bis unlogisch. Bitte präzisieren.

Insgesamt verstehe ich nicht wirklich worum es dir geht.

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: String-Typen: UTF-32 und Streams

Beitrag von Socke »

theo hat geschrieben:1. Es gibt einen UCS4String
Da die Frage nach UTF-32 gestellt war, wäre noch klar zu stellen: UCS4 entspricht UTF-32 beziehungsweise ist eine Obermenge dessen (seit Unicode 5.1)
Joz hat geschrieben:2. Bei UTF-32 ist die Zeichengröße ja fest (oder?) bei 4 Byte.
Richtig wäre: In UTF-32 enthält die kleinste Einheit (4 Byte) genau ein Unicode-Codepoint/Codepunkt. Ein Unicode-Codepunkt entspricht aber nicht zwingendermaßen einem grafischen Zeichen. Beispielsweise kann das ä als a + Trema oder ä gespeichert werden. Die Frage ist vielmehr, was du erreichen willst.
Joz hat geschrieben:Wie speichere ich aber UTF-8 in einem Stream? Soll ich vielleicht auch hier 4 Byte nehmen? (Dann würd ich aber überall UTF-32 wählen)
Einer Datei ist es egal, was sie beinhaltet. Von daher wieder die Frage: Was willst du erreichen?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

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: String-Typen: UTF-32 und Streams

Beitrag von mschnell »

Joz hat geschrieben: Wie speichere ich aber UTF-8 in einem Stream?
In einem (Byte-) Stream kann man alles speichern, was n * 8 Bit groß ist. Die Bedeutung und Kodierung spielt dabei keine Rolle. Wenn man es aus dem Stream wieder herausholt, sollte man natürlich wissen, wie es codiert ist, damit man etwas damit anfangen kann. (z.B.: "es ist ANSI Code Page xyz", "es ist UTF-8", oder "es ist UTF-32, high Byte fist").

-Michael

Joz
Beiträge: 40
Registriert: Mo 27. Mai 2013, 13:16
OS, Lazarus, FPC: Arch Linux, OpenSuse 13.2, Lazarus 1.4
CPU-Target: AMD64
Wohnort: Berlin

Re: String-Typen: UTF-32 und Streams

Beitrag von Joz »

Okay, also wird wohl bezüglich Frage 1 UCS4String das sein, was ich suche, danke.
Bei Frage 2 dachte ich daran, dass UTF8 ja eine variable Zeichengröße hat, was man möglicherweise (speicherplatz-verschwendend) durch Typkonvertierung in einen 4-Byte-Typen abfängt (zB. array of LongWord oder UTF32-Chars). Und wollte wissen, wie man den UTF-8 „roh“ in einen Stream speichert (Mit anderen Worten so, wie er im Arbeitsspeicher steht). Ich hoffe, das war jetzt logischer formuliert. Aber letztlich war mir die erste Frage wichtiger.

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

Re: String-Typen: UTF-32 und Streams

Beitrag von theo »

Joz hat geschrieben: Und wollte wissen, wie man den UTF-8 „roh“ in einen Stream speichert (Mit anderen Worten so, wie er im Arbeitsspeicher steht). Ich hoffe, das war jetzt logischer formuliert. Aber letztlich war mir die erste Frage wichtiger.
UTF-8 hat bezüglich des Speicherns in einem Stream keine anderen Eigenschaften als andere 8bit Kodierungen, bzw. jeder andere AnsiString.

Es bleibt die Frage, worum es dir eigentlich geht bzw. was du erreichen möchtest.
Ich werde den Verdacht nicht los, dass du dir selber darüber nicht ganz im Klaren bist. Also erkläre doch mal dein Ziel.

Normalerweise ist es übrigens nicht schlau in UCS4 zu streamen. UTF-8 ist sparsamer.
UCS4 hat allenfalls "in memory" Vorteile.

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: String-Typen: UTF-32 und Streams

Beitrag von mschnell »

Joz hat geschrieben: wie man den UTF-8 „roh“ in einen Stream speichert
Length() gibt bei UTF8 die Länge der Information in Bytes (nicht die Anzahl der sichtbaren Zeichen)
die Start-Adresse für Stream-Funktionen ist die Adresse des ersten Codes MyUTF8String[1].

-Michael

Joz
Beiträge: 40
Registriert: Mo 27. Mai 2013, 13:16
OS, Lazarus, FPC: Arch Linux, OpenSuse 13.2, Lazarus 1.4
CPU-Target: AMD64
Wohnort: Berlin

Re: String-Typen: UTF-32 und Streams

Beitrag von Joz »

Okay, ich glaube, ich hatte eine etwas falsche Vorstellung von UTF8. Ich werde einfach überall UTF8 nehmen und und auch so speichern. Danke für die Antworten!

Antworten