WideString, AnsiString, UTF8String, UCS4String Verwirrung

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
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: WideString, AnsiString, UTF8String, UCS4String Verwirrung

Beitrag von mschnell »

RSE hat geschrieben: s1 := s1+s2; // Konkatenation mit Operator "+" funktioniert nicht (Operator "+" not overloaded)[/quote)
Das ist peinlich für den Free-Pascal Compiler, genauso wie der ":=" Operator nicht ordentlich (implizit) mit UTF8Decode "overloaded" ist wenn man (wie in den diversen diskutierten Beispielen) WideString := UTF8String; schreibt.
Welche String-Operationen funktionieren auf nicht-ANSI-Strings denn Überhaupt so wie man es erwartet ;) ?

-Michael
Zuletzt geändert von mschnell am Mi 22. Okt 2008, 22:11, insgesamt 1-mal geändert.

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: WideString, AnsiString, UTF8String, UCS4String Verwirrung

Beitrag von mschnell »

theo hat geschrieben: .... dass es [UCS4String] kein eigentlicher String Typ ist sondern ein Dynamisches Array.
Das muss man halt gewissermassen "von Hand" umkopieren.
Peinlich, Peinlich ....
-Michael

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

Re: WideString, AnsiString, UTF8String, UCS4String Verwirrung

Beitrag von theo »

RSE hat geschrieben: bitte noch jemand den UCS4String konkatenieren. Ich hab auch mit dynamischen Arrays null Erfahrung und hab im Netz nichts zur Konkatenation speziell gefunden. Vielleicht liegt´s auch an meiner Müdigkeit... Ich würd da jetzt mit Zeigern rumhantieren, aber irgendwie hab ich Bauchschmerzen dabei.
Könnte man so machen:

Code: Alles auswählen

function UCS4StringConcat(a,b:UCS4String):UCS4String;
type PUCS4String=^UCS4String;
var alen,blen:integer;
Pa, Pb:PUCS4String;
begin
 alen:=Length(a);
 blen:=Length(b);
 SetLength(a,alen+blen);
 Pa:=@a[0];
 Pb:=@b[0];
 Inc(Pa,alen);
 Move(Pb^,Pa^,blen*SizeOf(UCS4Char));
 Result:=a;
end;
Die Lösung ist vielleich ein bisschen "sportlich" aber scheint zu funzen und ist schnell.

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: WideString, AnsiString, UTF8String, UCS4String Verwirrung

Beitrag von mschnell »

theo hat geschrieben:Die Lösung ist vielleich ein bisschen "sportlich" aber scheint zu funzen und ist schnell.
Sieht gut aus. Allerdings muss bei der Anwendung berücksichtigt werden, dass das als erster Parameter übergebene Feld verändert wird. Ein Rückgabe-Wert ist deshalb eigentlich nicht notwendig, sondern im Gegenteil irreführend.

a := UCS4StringConcat(b,c); arbeitet nicht mit drei UCS4Strings, sondern nur mit zweien
a := UCS4StringConcat(b,a); ergibt möglicherweise nicht das erwartete Ergebnis ???
a := UCS4StringConcat(b,b); ergibt möglicherweise nicht das erwartete Ergebnis ???

-Michael

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

Re: WideString, AnsiString, UTF8String, UCS4String Verwirrung

Beitrag von theo »

mschnell hat geschrieben:dass das als erster Parameter übergebene Feld verändert wird.
Ja klar, das sollte ja auch nur den Weg aufzeigen. Ich sagte ja "sportlich" ;-)
Diese Variante erweitert den "String" a um den "String" b. Die Deklaration wäre aber für den "blinden" Gebrauch irreführend.
Mit dieser Deklaration müsste man einen dritten "String" im Result erzeugen. Dabei würde natürlich ein Kopier-operation mehr anfallen.

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

Re: WideString, AnsiString, UTF8String, UCS4String Verwirrung

Beitrag von theo »

Habe übrigens eine neue Version meiner Klasse hier angehängt: http://www.lazarusforum.de/viewtopic.php?p=24321#p24321" onclick="window.open(this.href);return false;

Das Ganze heisst jetzt "utf8helper", das es doch im wesentlichen darum geht, den Umgang mit der Codierung welche die LCL verwendet zu vereinfachen.

Der Witz dabei ist, dass man auf den String auf alle möglichen Arten zugreifen kann, ohne sich gross zu kümmern.
Die Zugriffe lassen sich mischen. Man kann ja z.B. UTF8-Zeichen nicht mit "case" verwenden, da dies Strings sind.
Deshalb fragt man die einfach z.B. als UCS-4 (property UnicodeChars) ab.

Beispiel:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var uni:TUTF8Helper;
i:Integer;
begin
 uni:=TUTF8Helper.Create('Mal sehen');
 uni.UnicodeChars[2]:=$1033F; //Das "a" mit dem "GOTHIC LETTER URUS" als UCS4Char ersetzen
 
 for i:=1 to uni.Count do
  case uni.UnicodeChars[i] of
   $1033F: uni[i]:='ä';  // UCS4Char "GOTHIC LETTER URUS" mit UTF-8 'ä' ersetzen
  end;
 
 Memo1.text:=uni.UTF8Str;
 uni.free;
end;

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: WideString, AnsiString, UTF8String, UCS4String Verwirrung

Beitrag von mschnell »

theo hat geschrieben:Das Ganze heisst jetzt "utf8helper",
Zu viel Understatement ! nenn es doch UnicodeHelper !
theo hat geschrieben:das es doch im wesentlichen darum geht, den Umgang mit der Codierung welche die LCL verwendet zu vereinfachen.
Hmm. bleibt die LCL wirklich für immer utf-8 ? Kann ich kaum glauben, da es so blödsinnig ist.

Jedenfalls kann die Komponente sicherich einen Ärger sparen !

-Michael

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: WideString, AnsiString, UTF8String, UCS4String Verwirrung

Beitrag von Christian »

Ich finde UTF-8 nicht so blödsinnig da es von den meissten Widgetsets auch intern verwendet wird. Wenn es so blödsinnig ist warum nutzen dann die meissten Betriebsysteme mittlerweile UTF-8 ?! Das die Umsetzung z.Z. noch etwas buggy ist hat doch nichts mit UTF-8an sich zu tun.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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: WideString, AnsiString, UTF8String, UCS4String Verwirrung

Beitrag von mschnell »

Christian hat geschrieben:warum nutzen dann die meissten Betriebsysteme mittlerweile UTF-8 ?!
Windows benutzt Widestrings, das heißt natürlich nicht viel, die mnachen da genug anderen Blödsinn.
Christian hat geschrieben:Das die Umsetzung z.Z. noch etwas buggy ist hat doch nichts mit UTF-8an sich zu tun.
Wenn s := copy(s,3) mir nicht die ersten drei Zeichen des Strings liefert, finde ich das echt nicht schön. utf-8 ist ein optimales Speicherformat, weil es sehr kompakt ist, aber zum bearbeiten von Texten finde ich es weniger toll und würde immer WideStrings verwenden.
-Michael

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: WideString, AnsiString, UTF8String, UCS4String Verwirrung

Beitrag von Christian »

Windows benutzt UTF-16 und unter WinCE UTF-8.
Ales Widestrings. Lies dich doch mal in die Materie ein bevor du ständig unqualifizierte Kommentare von dir gibst.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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

Re: WideString, AnsiString, UTF8String, UCS4String Verwirrung

Beitrag von theo »

Christian hat geschrieben:Windows benutzt UTF-16 und unter WinCE UTF-8.
Ales Widestrings.
Ähem, stimmt nicht.
UTF-8 benutzt Ansistrings. (8 bit pro Char),
UTF-16, UCS-2 benutzt WideStrings (16 bit pro Char).
UTF-32, UCS-4 benutzt einen String Typen mit 32 bit pro Char (UCS4Strings in Lazarus).

Es sind aber alles Unicode Typen

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: WideString, AnsiString, UTF8String, UCS4String Verwirrung

Beitrag von Christian »

Ich rede davon welche Technologie im Betriebsystem eingesetzt wird nicht wie fpc das auf eigene Bezeichner mappt.
WideString ist ein fpc interner Bezeichner.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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

Re: WideString, AnsiString, UTF8String, UCS4String Verwirrung

Beitrag von theo »

Christian hat geschrieben:Ich rede davon welche Technologie im Betriebsystem eingesetzt wird nicht wie fpc das auf eigene Bezeichner mappt.
WideString ist ein fpc interner Bezeichner.
Was willst du denn dann damit sagen "Windows benutzt UTF-16 und unter WinCE UTF-8. Alles Widestrings." ?

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: WideString, AnsiString, UTF8String, UCS4String Verwirrung

Beitrag von Christian »

NEIN
Widestring ist eine FPC interne begrifflichkeit
Diesen Begriff gibts nirgendwo anders
Die Technologie ist UTF-8, UTF-16 oder UTF-32 und Überbegriff Unicode fähigkeit.

Widestring ist ein fpc Datentyp.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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

Re: WideString, AnsiString, UTF8String, UCS4String Verwirrung

Beitrag von theo »

???
Ich habe oben die Frage gestellt, was du damit meintest (Das war ein Zitat von DIR !) hier http://www.lazarusforum.de/viewtopic.php?p=24396#p24396" onclick="window.open(this.href);return false;

Offenbar widersprichst du dir jetzt schon wehement selber, ohne es zu bemerken... ;-)

Antworten