Oder intern nicht mit utf-8 codierten ansistrings, sondern mit widestrings arbeiten. Siehe MSEgui. Übrigens hatte ich MSEgui mal für 2 Monate auf utf-8 umgestellt, weil FPC mit widestrings zu grosse Probleme machte. Als ich erlebt habe, was utf-8 für ein Theater ist, kehrte ich zu widestrings zurück und schrieb so lange bug reports, bis FPC widestrings funktionierten...RSE hat geschrieben:Vielleicht wäre es bei so viel Verwirrung bzw. nötigen Kenntnissen sogar sinnvoll, einen Datentypen zu schaffen, der UTF8 so speichert, dass man leicht auf den x. Buchstaben zugreifen kann und entsprechende Funktionen, um diesen Typen dann mit den Standard-String-Funktionen verwenden zu können. Wenn mal effizient mit Strings gearbeitet werden muss, muss man natürlich wieder wissen, was man tut. Aber für Anfänger und an zeitunkritischen Stellen wär das vielleicht ganz hilfreich. Ich denke da an ein Objekt mit entsprechenden Eigenschaften, die entsprechend geschrieben und gelesen werden können.
WideString, AnsiString, UTF8String, UCS4String Verwirrung
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: WideString, AnsiString, UTF8String, UCS4String Verwirrung
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: WideString, AnsiString, UTF8String, UCS4String Verwirrung
FPC wird in zukünftigen Versionen einen referenz gezählten widestring auf allen Plattformen erhalten, der Typ nennt sich UnicodeString und ist in FPC trunk bereits implementiert.mschnell hat geschrieben:Deshalb hatte ich ja vermutet, dass String nun = Widestring ist, weil das wohl in 90% der Anwendungen die ideale Lösung ist (zumindest wenn derselbe "layz-copy" algorithmus verwendet wird wie bei "alten" ANSIStrings).
-
- Beiträge: 462
- Registriert: Mi 30. Jul 2008, 13:11
- OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
- CPU-Target: 32Bit
- Kontaktdaten:
Re: WideString, AnsiString, UTF8String, UCS4String Verwirrung
Ich arbeite im Modus {$mode objfpc}{$H+}, und somit ist String bei mir ANSIString. Da ich bei meinem aktuellen Projekt sehr wenig an Strings herummanipuliere, ist das kein größeres Problem und somit halte ich ANSIString für mein Projekt auch für passend. Mein Vorschlag gilt allerdings weniger Speicherplatzproblemen als vielmehr der Vorbeugung von Problemen bei Anfängern und der Vereinfachung von Konvertierungen. Ich stelle mir dieses Objektinterface etwa so vor:
Intern sollte die Umwandlung jeweils nur nach Notwendigkeit erfolgen, also auf Geschwindigkeit optimiert, nicht auf Speicherverbrauch. Dieses Konstrukt regt dazu an, sich mit den verschiedenen Codierungen auseinanderzusetzen und bietet zudem eine komfortable Speicher- und Umwandlungsmöglichkeit. Der Overhead sollte ertragbar bleiben, da ja in einer exe der Code für die Funktionen für jede Klasse nur 1x gespeichert wird, lediglich für die Felder wird für jede Instanz Speicher reserviert, und der Speicherplatzbedarf für die Felder dürfte in diesem Fall ziemlich gering ausfallen
. Man könnte die Speicherung z.B. in einem Packed Record organisieren, in dem entweder ein ANSIString, ein WideString oder ein PChar steht (ich hoffe, ich habe das mit den Packed Records nicht falsch verstanden
).
Code: Alles auswählen
TStr = class(TObject)
...
public
property UTF8String: String read GetUTF8String write SetUTF8String;
property UTF16String: String read GetUTF16String write SetUTF16String;
property UTF32String: String read GetUTF32String write SetUTF32String;
property UTF8ANSIString: ANSIString read GetUTF8ANSIString write SetUTF8ANSIString;
property UTF16ANSIString: ANSIString read GetUTF16ANSIString write SetUTF16ANSIString;
property UTF32ANSIString: ANSIString read GetUTF32ANSIString write SetUTF32ANSIString;
property UTF8WString: WideString read GetUTF8WString write SetUTF8WString;
property UTF16WString: WideString read GetUTF16WString write SetUTF16WString;
property UTF32WString: WideString read GetUTF32WString write SetUTF32WString;
function GetCharacterFromPosition(APosition: Cardinal): ANSIString; // gibt den Buchstaben an der Position APosition im Wort zurück
function CountCharacters: Cardinal; // Zählt die Anzahl der Buchstaben
end;


Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!
Re: WideString, AnsiString, UTF8String, UCS4String Verwirrung
Deine Typen verstehe ich nicht.
Ein String ist ja normalerweise ein AnsiString. Pascal Strings brauchts hier wohl eher nicht.
Ein UTF16String und ein UTF32String passen nicht in einen String (AnsiString);
UTF8WString macht keinen Sinn.
UTF32WString ist kein WideString sondern ein 32 bit String (UCS4String).
Oder verstehe ich da was falsch?
Ein String ist ja normalerweise ein AnsiString. Pascal Strings brauchts hier wohl eher nicht.
Ein UTF16String und ein UTF32String passen nicht in einen String (AnsiString);
UTF8WString macht keinen Sinn.
UTF32WString ist kein WideString sondern ein 32 bit String (UCS4String).
Oder verstehe ich da was falsch?
-
- 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: WideString, AnsiString, UTF8String, UCS4String Verwirrung
UniCodeString hört sich gut an. UCS2 ist ja auch UniCodemse hat geschrieben:FPC wird in zukünftigen Versionen einen referenz gezählten widestring auf allen Plattformen erhalten, der Typ nennt sich UnicodeString und ist in FPC trunk bereits implementiert.

-Michael
Re: WideString, AnsiString, UTF8String, UCS4String Verwirrung
Tut aber nichts zur Sache, das bleibt ein WideString und Lazarus hat sich für UTF8 entschieden.mschnell hat geschrieben: UniCodeString hört sich gut an. UCS2 ist ja auch UniCode![]()
Übrigens ist alles Unicode auch UTF-8, UCS4 etc.
-
- Beiträge: 462
- Registriert: Mi 30. Jul 2008, 13:11
- OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
- CPU-Target: 32Bit
- Kontaktdaten:
Re: WideString, AnsiString, UTF8String, UCS4String Verwirrung
Wenn ich das richtig verstanden habe, so ist die Standardeinstellung in Lazarus für String jetzt WideString. Bei mir ist es lediglich durch die Compilerschalter noch AnsiString. Lazarus arbeitet also mit UTF-8 auf WideStringstheo hat geschrieben:Deine Typen verstehe ich nicht.
Ein String ist ja normalerweise ein AnsiString. Pascal Strings brauchts hier wohl eher nicht.
Ein UTF16String und ein UTF32String passen nicht in einen String (AnsiString);
UTF8WString macht keinen Sinn.
UTF32WString ist kein WideString sondern ein 32 bit String (UCS4String).
Oder verstehe ich da was falsch?

Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!
Re: WideString, AnsiString, UTF8String, UCS4String Verwirrung
FalschRSE hat geschrieben: Wenn ich das richtig verstanden habe, so ist die Standardeinstellung in Lazarus für String jetzt WideString.

BlödsinnRSE hat geschrieben: Lazarus arbeitet also mit UTF-8 auf WideStrings.

Ist aber nicht so. Nur UTF-8 kommt in einen AnsiString. UTF16 in einen WideString und UCS4 in einen UCS4String.RSE hat geschrieben: UTF16 und UTF32 könnten schon in AnsiString gespeichert werden, wenn jeweils 2 bzw. 4 Ansi-Zeichen für ein UTF-16 bzw. UTF-32 Zeichen verbraucht würden.
Alles Klar?

-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: WideString, AnsiString, UTF8String, UCS4String Verwirrung
Nein, nach wie vor gilt string=ansistring. Lazarus speichert Quelltext standardmässig in utf-8, die LCL erwartet und liefert ansistrings, welche utf-8 codierten Text enthalten. Alles klar?RSE hat geschrieben: Wenn ich das richtig verstanden habe, so ist die Standardeinstellung in Lazarus für String jetzt WideString. Bei mir ist es lediglich durch die Compilerschalter noch AnsiString. Lazarus arbeitet also mit UTF-8 auf WideStrings

-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: WideString, AnsiString, UTF8String, UCS4String Verwirrung
Wenn das keine Gedankenübertragung ist!theo hat geschrieben: Alles Klar?![]()



-
- 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: WideString, AnsiString, UTF8String, UCS4String Verwirrung
Warm keine array-property ?RSE hat geschrieben: function GetCharacterFromPosition(APosition: Cardinal): ANSIString; // gibt den Buchstaben an der Position APosition im Wort zurück
Warum nicht property count: Cardinal: read GetCount;RSE hat geschrieben: function CountCharacters: Cardinal; // Zählt die Anzahl der Buchstaben
Warum nicht entweder UTF8: sehr langsam, wenig Speicher oder UCS-4, schnell, viel Speicher ?RSE hat geschrieben: Man könnte die Speicherung z.B. in einem Packed Record organisieren, in dem entweder ein ANSIString, ein WideString oder ein PChar steht (ich hoffe, ich habe das mit den Packed Records nicht falsch verstanden).
-Michael
-
- 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: WideString, AnsiString, UTF8String, UCS4String Verwirrung
Widestring kann man vielleicht als alles mögliche interpretieren, aber nicht als utf-8.theo hat geschrieben:Tut aber nichts zur Sache, das bleibt ein WideString und Lazarus hat sich für UTF8 entschieden.
-Michael
Re: WideString, AnsiString, UTF8String, UCS4String Verwirrung
mse hat geschrieben: Wenn das keine Gedankenübertragung ist!![]()
![]()


Re: WideString, AnsiString, UTF8String, UCS4String Verwirrung
Kann dir nicht folgen was du damit meinst.mschnell hat geschrieben:Widestring kann man vielleicht als alles mögliche interpretieren, aber nicht als utf-8.theo hat geschrieben:Tut aber nichts zur Sache, das bleibt ein WideString und Lazarus hat sich für UTF8 entschieden.
-
- 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: WideString, AnsiString, UTF8String, UCS4String Verwirrung
Das hatte ich auch gedacht, scheint sich aber als Irrtum herausgestellt zu haben. In meinem Beispiel, das ich ohne Veränderung irgendwelcher Einstellungen fabriziert habe ist String irgendeine 8-bit Kodierung und Uppercase für String ruft SYSUTILS_UPPERCASE$ANSISTRING$$ANSISTRING auf.RSE hat geschrieben:Wenn ich das richtig verstanden habe, so ist die Standardeinstellung in Lazarus für String jetzt WideString.
Genausowenig ist die Sourcecode-Datei utf-8 kodiert, obwohl die Einstellung (rechte Maustaste im Editor...) das behauptet. Die Datei ist eindeutig UCS2-Kodiert.
Da bin ich ganz Deiner Meinung. Und eine Beschreibung, was diese Möglichkeiten genau sind und was genau passieren soll !RSE hat geschrieben:Und ich finde, dass so ein Datentyp, wenn er schon existiert, auch alle Möglichkeiten zur Verfügung stellen sollte.
-Michael
Zuletzt geändert von mschnell am Di 21. Okt 2008, 16:19, insgesamt 2-mal geändert.