String-Typen: UTF-32 und Streams
-
- 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
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.
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.
Re: String-Typen: UTF-32 und Streams
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.
2. Die zweite Frage ist unklar bis unlogisch. Bitte präzisieren.
Insgesamt verstehe ich nicht wirklich worum es dir geht.
-
- 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
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)theo hat geschrieben:1. Es gibt einen UCS4String
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:2. Bei UTF-32 ist die Zeichengröße ja fest (oder?) bei 4 Byte.
Einer Datei ist es egal, was sie beinhaltet. Von daher wieder die Frage: Was willst du erreichen?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)
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- 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
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").Joz hat geschrieben: Wie speichere ich aber UTF-8 in einem Stream?
-Michael
-
- 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
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.
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.
Re: String-Typen: UTF-32 und Streams
UTF-8 hat bezüglich des Speicherns in einem Stream keine anderen Eigenschaften als andere 8bit Kodierungen, bzw. jeder andere AnsiString.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.
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.
-
- 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
Length() gibt bei UTF8 die Länge der Information in Bytes (nicht die Anzahl der sichtbaren Zeichen)Joz hat geschrieben: wie man den UTF-8 „roh“ in einen Stream speichert
die Start-Adresse für Stream-Funktionen ist die Adresse des ersten Codes MyUTF8String[1].
-Michael
-
- 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
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!