[gelöst] Fehler bei Stringkonvertierung

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
mse
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: Fehler mit Stringkonvertierung

Beitrag von mse »

AFAIK für Lazarus: string = AnsiString = AnsiString(CP_ACP) = System code page.

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: Fehler mit Stringkonvertierung

Beitrag von mschnell »

Ich hatte es daher: http://support.microsoft.com/kb/108450
-Michael

mse
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: Fehler mit Stringkonvertierung

Beitrag von mse »

Dann passt es ja.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Fehler mit Stringkonvertierung

Beitrag von Michl »

Ich glaub, ich habs jetzt erstmal verstanden. Der Fehler in dem Minimalbsp war, dass ich davon ausging, dass FPC und Lazarus UTF8 intern nutzen. Das stimmt nicht, normale Strings sind AnsiStrings (es sei denn man stellt die Codepage, wie von mse vorgeschlagen, um)! Auch scheint der Compiler immer (zumindest in dem angehangenen Test, selbst wenn der Degugger zuvor schipft, dass man dies explizit selber tun sollte) alle Strings automatisch in den jeweilig neuen Stringtyp umzuwandeln, das war mir vorher auch nicht 100%ig klar.

Daher läuft das Minimalbsp dann ohne Probleme bei

Code: Alles auswählen

var
  Str: String;
  S: UnicodeString;
begin
  ... 
  S:=UnicodeString(Str);
  Str:=AnsiString(S);
Da Diskussionen, wie (ist fast wie ein Dejavue :) ) http://www.lazarusforum.de/viewtopic.php?f=12&t=5393 oder http://www.lazarusforum.de/viewtopic.php?p=62307 mich eher verwirren, als mir helfen, habe ich mir mal eine kleine Übersicht gebastelt. Mir hilft es mehr, die Bytes hinter einem String zu sehen, als nur die Theorie zu studieren!

Falls jemand ähnliche Verständigungsprobleme mit den Stringtypen hat, habe ich die Übersicht mal angehangen (PS. läuft erst ab FPC 2.7.1, unter 2.6.2 müssten die TestStrings auskommentiert werden):
Dateianhänge
StringTest.zip
(130.59 KiB) 56-mal heruntergeladen
Test.jpg
Zuletzt geändert von Michl am Di 29. Okt 2013, 21:06, insgesamt 1-mal geändert.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

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: Fehler mit Stringkonvertierung

Beitrag von mschnell »

Michl hat geschrieben:..ist fast wie ein Dejavue :) ...
Wie Theo so richtig sagte:
theo hat geschrieben: Habe irgendwie keine Lust mehr bei sowas die Implementierung "du jour" zu verinnerlichen.

mse
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: Fehler mit Stringkonvertierung

Beitrag von mse »

Michl hat geschrieben:Ich glaub, ich habs jetzt erstmal verstanden.
Hast du die string-Konstanten Konvertierung zur Kompilierzeit auch berücksichtigt? {$codepage utf8} stellt nicht die default system codepage um sondern sagt dem Compiler, dass die string-Konstanten im Quellcode in utf-8 vorliegen. Auf die Laufzeit hat dies keinen Einfluss.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Fehler mit Stringkonvertierung

Beitrag von Michl »

mse hat geschrieben:
Michl hat geschrieben:Ich glaub, ich habs jetzt erstmal verstanden.
Hast du die string-Konstanten Konvertierung zur Kompilierzeit auch berücksichtigt? {$codepage utf8} stellt nicht die default system codepage um sondern sagt dem Compiler, dass die string-Konstanten im Quellcode in utf-8 vorliegen. Auf die Laufzeit hat dies keinen Einfluss.
Habe ich natürlich nicht berücksichtigt, daher danke für die weitergehende Info! :) :)

{$codepage utf8} habe ich auch wieder entfernt. Dies war nur notwendig, bei diesem Bsp., das hatte aber eigentlich mit meinem Ausgangsproblem nichts direkt gemein (weiss ich jetzt). Ich bekomme UTF8-Strings zur Laufzeit herein, diese Bearbeitung hatte erst nicht funktioniert, tut es aber jetzt! Kann es auch nicht mehr rekonstruieren woran es mal ursprünglich lag.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: [gelöst] Fehler bei Stringkonvertierung

Beitrag von Michl »

Ich hab auch endlich mein Ursprungsproblem verstanden (ich hoffe meine Synapsen im Gehirn haben sich auch tatsächlich endlich richtig verknüpft), daher nochmals Danke an Alle!

Eine Weile hatte ich mit Lazarus unter FPC 2.6.2 entwickelt. Dort war String = AnsiString = UTF8String (zumindest bei mir, wenn ich die Zeichenkette "ÄÖÜäöüß" mir anzeigen lasse, ist sie überall im Speicher als "C3 84 C3 96 C3 9C C3 A4 C3 B6 C3 BC C3 9F" abgelegt (die entspricht UTF8 siehe http://www.utf8-zeichentabelle.de/). Seit einiger Zeit nutze ich aber die Snapshots mit Lazarus unter FPC 2.7.1, dort war es mir lange Zeit nicht aufgefallen, dass da eben String nicht mehr gleich UTF8String ist, da erst Sonderzeichen Probleme machen.

Weiter denke ich, dass die UTF8Strings derzeit in FPC 2.7.1 - Trunc nicht verwendbar sind, da der String "ÄÖÜäöüß" als "C3 83 E2 80 9E C3 83 E2 80 93 C3 83 C5 93 C3 83 C2 A4 C3 83 C2 B6 C3 83 C2 BC C3 83 C5 B8" im Speicher gehalten wird, was nicht unbedingt UTF8 entspricht. Ich weiss nicht, ob ich dazu den Bugtracker in Kenntniss setzen sollte oder ob das einfach so ist, weil halt gerade daran gearbeitet wird?

Daher arbeitet mein Projekt auch wieder ordentlich, da ich die Variablen, die als "UTF8String" definiert waren durch "String" (und String = AnsiString(CP_ACP) = UTF8String von FPC 2.6.2) ersetzt hatte. So ein simpler "Fehler" oder "Bug" hat mich so lange Nerven gekostet...

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

mse
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: [gelöst] Fehler bei Stringkonvertierung

Beitrag von mse »

Wobei für FPC 2.6.2 UTF8String keine Bedeutung hat. utf-8 Stringkonstanten in AnsiString = UTF8String bekommst du da nur weil Lazarus den Quellcode in utf-8 abspeichert und der Compiler wegen fehlendem {$codepage utf8} keine Konvertierungen vornimmt.

Antworten