Wie funktioniert RawByteString? (ab FPC 3.x)
-
- 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: Wie funktioniert RawByteString? (ab FPC 3.x)
Wenn ich vor 4 Jahren ein Delphi Projekt hatte und bei Delphi geblieben bin, musste es von 8 Bit ANSI Strings auf 16 Bit Strings umgestellt werden.
Wenn ich weiter bei Delphi bleibe, muss ich es demnächst auf 0-Basierten immutable Strings umstellen.
Wenn ich jetzt dieses Delphi XE Projekt habe und jetzt auf Lazarus umsteige, muss ich es von 16 Bit Strings auf 8 Bit UTF-8 Strings umstellen.
Wenn ich dann das Lazarus Projekt habe, muss ich es demnächst auf die neuen dynamisch codierten Strings (egal welche Codierung) umstellen.
Später dann darf ich vielleicht trotzdem auf die die 0-Basierten immutable Strings (jetzt zwingend 16 Bit codiert) umsteigen.
Wenn ich außer Strings mit sichtbaren Zeichen noch Strings für Byte-Folge verwende, habe ich noch besonders viel Spaß, um die entweder auf irgendwelche codierten Strings, auf RawByteStrings, oder auf Byte Arrays, jeweils mit unterschiedlichen Auswirkungen umzustellen.
Alles höchst erfreulich !
Hätte ich das Projekt doch gleich in Java programmiert !!!!
-Michael
Wenn ich weiter bei Delphi bleibe, muss ich es demnächst auf 0-Basierten immutable Strings umstellen.
Wenn ich jetzt dieses Delphi XE Projekt habe und jetzt auf Lazarus umsteige, muss ich es von 16 Bit Strings auf 8 Bit UTF-8 Strings umstellen.
Wenn ich dann das Lazarus Projekt habe, muss ich es demnächst auf die neuen dynamisch codierten Strings (egal welche Codierung) umstellen.
Später dann darf ich vielleicht trotzdem auf die die 0-Basierten immutable Strings (jetzt zwingend 16 Bit codiert) umsteigen.
Wenn ich außer Strings mit sichtbaren Zeichen noch Strings für Byte-Folge verwende, habe ich noch besonders viel Spaß, um die entweder auf irgendwelche codierten Strings, auf RawByteStrings, oder auf Byte Arrays, jeweils mit unterschiedlichen Auswirkungen umzustellen.
Alles höchst erfreulich !
Hätte ich das Projekt doch gleich in Java programmiert !!!!
-Michael
Re: Wie funktioniert RawByteString? (ab FPC 3.x)
Ich dachte du programmierst gar nicht mehr sondern motzt nur noch rum?mschnell hat geschrieben: Alles höchst erfreulich !
Hätte ich das Projekt doch gleich in Java programmiert !!!!

In den meisten Fällen spielt das doch gar keine Rolle oder ist mit ein paar Handgriffen angepasst.
Ich finde das Thema überbewertet. Mich, und wahrsch. die meisten User, hat dieses String Durcheinander noch nie von einem Projekt abgehalten.
-
- 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: Wie funktioniert RawByteString? (ab FPC 3.x)
Die Heuristik ist notwendig. Wenn du meinen Beitrag noch einmal durchliest, wirst du merken, dass die Metadaten im "Verwaltungs-Record des Strings" unter Umständen (Datei, Netzwerk, Registry, Pipes/Prozesse, Datenbank etc.) gar nicht vorhanden sind.mschnell hat geschrieben:Heuristik braucht man nicht: der Codierungstpy und die Länge der einzelnen Codes (1, 2 oder 4 Byte) steht (neben Referenz-Zähler, Länge und Pointer auf den String-Inhalt) im Verwaltungs-Record des Strings.Socke hat geschrieben:Wenn die Kodierung unbekannt ist, werden die Daten als ASCII (Single-Byte, ein Codepoint ist maximal 1 Byte groß) geladen und mit Heuristiken entschieden, wie sie weiterverarbeitet werden.
Ein Heuristik-Problem gibt es nur bei String-Konstanten, wo der Compiler raten muss was der User mit seiner #1234 Notation meint
Für Stringkonstanten sollte die Quelltextcodierung ausschlaggebend sein. Leider wird der dafür existierende Compiler-Schalter nicht dafür vorgesehen (er wird als unbaruchbar angesehen).
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: 203
- Registriert: Di 22. Sep 2009, 13:08
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
Re: Wie funktioniert RawByteString? (ab FPC 3.x)
Das sieht nicht sonderlich gut aus. Wird da allen Ernstes reines ASCII erst in WideString gewandelt und dann wieder zurück?EgonHugeist hat geschrieben: Um die Compiler-Magig vom FPC2.7.x & D2009+ etwas aufzuklären
String(GetACP) := AnsiString(GET_ACP, AnsiDaten)+UTFString(CP_UTF8, UTF8-Daten) sollte vollgendes durchführen:
String_Daten := AnsiDaten + WideToAnsiMove(UTF8ToWideMove(UTF8Daten)); somit ist Data-Loss möglich
Err... geht das nicht einfacher ohne Umweg?!EgonHugeist hat geschrieben: Wie sonst sollte der Compiler die 2Byte Chars auf Single-Byte umstellen können? Oder Ansi Codierungen auf UTF8 automatisch umstellen?
-
- 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: Wie funktioniert RawByteString? (ab FPC 3.x)
Re: Pascal: Stímmt. Im Moment mache ich jeden Tag 8 Stunden am Tag nur C.theo hat geschrieben:Ich dachte du programmierst gar nicht mehr sondern motzt nur noch rum?![]()


Da haben mir meine Kollegen, die ca. 1 Mio Zeilen Delphi betreuen, aber was anderes erzählt ...theo hat geschrieben:In den meisten Fällen spielt das doch gar keine Rolle oder ist mit ein paar Handgriffen angepasst.
Ich würde sie liebend gerne von Lazarus überzeugen, damit wir das System endlich auf Linux umstellen können, weil Windows mit jeder neuen Version mehr nervt. Aber die trauen sich nicht.
-Michael
-
- Beiträge: 93
- Registriert: Di 17. Apr 2012, 22:41
Re: Wie funktioniert RawByteString? (ab FPC 3.x)
Nun.. Ja. Ich bin mir ziehmlich sicher, daß es so funzt. Problem hierbei ist (meiner Meinung nach), daß Funtionen oder Out/Var Parameter NICHT mit zusätzlichen Ergebnis-CodePages, wie ASCII7, existieren und deren Typsierung über den Parameter/Result klar sind: AnsiString/UTF8String/RawByteString/UnicodeString/WideString.Das sieht nicht sonderlich gut aus. Wird da allen Ernstes reines ASCII erst in WideString gewandelt und dann wieder zurück?
Doch! Ein Vögelchen hat mir gezwitschert, daß beim FPC2.7 ein eigenes LibIConv geplant und gebastelt wird. JEDOCH:Err... geht das nicht einfacher ohne Umweg?!
Stelle die eine laaaaaange Tabelle vor von #0..High(Word) (Unicode/Wide) oder High(Longword) UCS4 und danach vieeeeeele Spalten von CodePages 0..x mit den äquivalenten Byte-Sequencen, welches je nach CP den "Char" zurück gibt. Somit wäre man in der Lage direkt von CP_x zu CP_y zu kodieren. Anderer seits bringt das Unmengen an Code mit. AFAIK nutzt Delphi+OSX auch iconv für die Umwandlungen.
Nun woher soll den der Compiler wissen, dass in dem String(What Ever) nur ASCII7 Bytes enthalten sind?. Du bist doch der Entwickler und solltest hier für Optimierung sorgen ----> nutze eigen RawByteString Converter!
Die Portierung der Apps ist das kleinere Problem. Zugriffe auf externes muß man jedoch überall anpassen. Siehe Unicode vs. SingleByte-RDBM's.
Zahn der Zeit. Globaliesierung.. Dolle Wurst! LOL
ZeosDevTeam
-
- Beiträge: 768
- Registriert: Mo 4. Mai 2009, 13:24
- OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
- CPU-Target: x86_64-linux-qt/gtk2
- Kontaktdaten:
Re: Wie funktioniert RawByteString? (ab FPC 3.x)
Wie schaut es mit der Geschwindigkeit aus? Ich trau mich schon gar nicht, auf 2.7 zu aktualisieren.EgonHugeist hat geschrieben:Nun.. Ja. Ich bin mir ziehmlich sicher, daß es so funzt.Das sieht nicht sonderlich gut aus. Wird da allen Ernstes reines ASCII erst in WideString gewandelt und dann wieder zurück?
http://forum.lazarus.freepascal.org/ind ... 521.0.html
-
- Beiträge: 203
- Registriert: Di 22. Sep 2009, 13:08
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
Re: Wie funktioniert RawByteString? (ab FPC 3.x)
Nun ja. Ein Komponentenset, das mit UTF8 arbeitet, sollte in der Tat als Parameter einen UTF8-StringTyp verwenden und keinen allgemeinen String-Container.EgonHugeist hat geschrieben: Nun.. Ja. Ich bin mir ziehmlich sicher, daß es so funzt. Problem hierbei ist (meiner Meinung nach), daß Funtionen oder Out/Var Parameter NICHT mit zusätzlichen Ergebnis-CodePages, wie ASCII7, existieren und deren Typsierung über den Parameter/Result klar sind: AnsiString/UTF8String/RawByteString/UnicodeString/WideString.
Dann kann man sich auch intern einen Haufen unnötiger Encoding-Vergleiche sparen.
Wenn ich mich mal so umsehe, ist eigentlich alles an Daten was ich sehe entweder ANSI (alles was jemals über ein Keyboard eingetippt wurde, ...) oder UTF8 (Web, Datenbank-Unicode, ...). Und die Texte bestehen auch noch alle zu 98% aus ASCII. So eine Konvertierung sollte im Normalfall fast nur aus NOPs bestehen.Stelle die eine laaaaaange Tabelle vor von #0..High(Word) (Unicode/Wide) oder High(Longword) UCS4 und danach vieeeeeele Spalten von CodePages 0..x mit den äquivalenten Byte-Sequencen, welches je nach CP den "Char" zurück gibt. Somit wäre man in der Lage direkt von CP_x zu CP_y zu kodieren. Anderer seits bringt das Unmengen an Code mit. AFAIK nutzt Delphi+OSX auch iconv für die Umwandlungen.
Nun woher soll den der Compiler wissen, dass in dem String(What Ever) nur ASCII7 Bytes enthalten sind?. Du bist doch der Entwickler und solltest hier für Optimierung sorgen ----> nutze eigen RawByteString Converter!
Wenn man die Konvertierungen wenigstens irgendwo individuell ausprogrammieren kann bestehen vielleicht noch eine Chance das ganze gerade zu biegen.
Ansonsten muss wenn wohl vorerst auf RawByteString setzen und den ganzen Automatismus so gut es geht aushebeln.
Womit man wieder beim Thema "Wie funktioniert RawByteString" wäre...
Wie macht man es jetzt bei RawByteString mit den String-Konstanten? Irgendwelche Heuristiken um das Encoding der Konstanten zu raten funktionieren da ja nicht.
Wie typisiert man jetzt seine Konstanten korrekt?