[gelöst] Fehler bei Stringkonvertierung
-
- 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
AFAIK für Lazarus: string = AnsiString = AnsiString(CP_ACP) = System code page.
-
- 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
Ich hatte es daher: http://support.microsoft.com/kb/108450
-Michael
-Michael
-
- 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
Dann passt es ja.
Re: Fehler mit Stringkonvertierung
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
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):
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);

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
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;
-
- 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
Wie Theo so richtig sagte:Michl hat geschrieben:..ist fast wie ein Dejavue...
theo hat geschrieben: Habe irgendwie keine Lust mehr bei sowas die Implementierung "du jour" zu verinnerlichen.
-
- 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
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 hat geschrieben:Ich glaub, ich habs jetzt erstmal verstanden.
Re: Fehler mit Stringkonvertierung
Habe ich natürlich nicht berücksichtigt, daher danke für die weitergehende Info!mse hat geschrieben: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 hat geschrieben:Ich glaub, ich habs jetzt erstmal verstanden.


{$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;
Re: [gelöst] Fehler bei Stringkonvertierung
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...
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;
-
- 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
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.