Dann zeige doch bitte wie gross der Anteil an Umlautproblem-Themen im Deutschen Lazarusforum ist, welche ebenfalls bestehen würden, wenn Lazarus UnicodeString statt "utf-8 in AnsiString ohne BOM oder {$codepage utf8} oder -Fcutf8" verwenden würde. Ich vermute der Anteil ist gering.martin_frb hat geschrieben: Die meisten Programmierer sind doch an Zeichen interessiert. Einige wissen nicht mal was ein Codepoint ist.
Und in Sachen Zeichen, ist UTf16 nicht besser als UTF8. Es erweckt lediglich *oberflächlich* den Eindruck, das es besser wäre.
MSElang, der zukünftige Compiler für MSEide+MSEgui
-
- 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: MSElang, der zukünftige Compiler für MSEide+MSEgui
-
- 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: MSElang, der zukünftige Compiler für MSEide+MSEgui
In UTF-16 muss man prüfen, ob an der Speicherstelle str1[5] die nächsten 2 Bytes 00e4 sindmse hat geschrieben: Bei *bekannten* Zeichen schon!!!funktioniert in utf-16 immer weil 'ä' < #$d800 ist in utf-8 nie, da 'ä' > #$7f ist. Ist das wirklich so schwierig?Code: Alles auswählen
if str1[5] = 'ä' then begin
bei UTF-8 muss man prüfen, ob die nächsten 2 Bytes c3a4 sind.
Von den Operationen her ist das fast identisch (die Buffer-Overflow-Prüfung ist nicht ganz identisch, aber sehr sehr ähnlich).
Wobei man bei UTF-16 - Algorithmen im allgemeinen eher mehr Ärger mit Buffer-Enden hat, da normalerweise
weniger in die Buffer passt.
Das Problem von Pascal hier ist eventuell, dass die Konstanten nicht ordentlich auf UTF-8 bzw. UTF-16 typisiert sind,
es gibt keine schöne Syntax dafür, und der Compiler rät einfach zuviel. (daher vielleicht auch die Ideen mit den Casts, mit
denen man die Raterei eventuell aushebeln kann).
Die Konstanten sind aber ein Problem der Pascal-Syntax - von einem Vorteil von UTF-16 ist da weit und breit nichts zu sehen.
Zuletzt geändert von Patito am Di 5. Nov 2013, 12:05, insgesamt 1-mal geändert.
-
- 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: MSElang, der zukünftige Compiler für MSEide+MSEgui
In diesem Thread geht es momentan ja gerade darum die Datentypen "???String" und den passenden "???Char" für den neuen Compiler zu definieren. Das müssen nicht "String" und "Char" sein wie aus irgendeiner Delphi oder fpc-Version bekannt (in den unterschiedlichen Versionen sind die ja teilweise unter der Hand umdefiniert worden).martin_frb hat geschrieben: In UTF8 muss bereits der Datentyp fuer einen Codepoint multi-byte sein, und oft wird hier ein String verwendet. In Utf16 wuerde das ein WideChar sein. In einem String kann man natürlich auch eine Codepoint Sequenz (ein Zeichen) speichern. In einem WideChar nicht
-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: MSElang, der zukünftige Compiler für MSEide+MSEgui
Daher mein Vorschlag, dass echte Texte (also auch Konstanten) immer UTF16 sind, und 8 - Bit Strings immer als "RawByte" behandelt werden, die nicht direkt anzeigbar und auch nicht automatisch auf UTF16Strings konvertierbar sind. Konvertierung ist nur durch den expliziten Aufruf von RTL-Funktionen möglich, bei denen die gewünschte Kodierung explizit angegeben wird (als Funktions-Name oder als Argument).Patito hat geschrieben:Das Problem von Pascal hier ist eventuell, dass die Konstanten nicht ordentlich auf UTF-8 bzw. UTF-16 typisiert sind,
es gibt keine schöne Syntax dafür, und der Compiler rät einfach zuviel.
Das ist meiner Ansicht nach die einzige pragmatisch sinnvolle Alternative zu einer ordentlichen (!!) Implementierung von "Code Aware" Strings um Unicode zu ermöglichen.
-Michael
Zuletzt geändert von mschnell am Di 5. Nov 2013, 12:06, insgesamt 3-mal geändert.
-
- 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: MSElang, der zukünftige Compiler für MSEide+MSEgui
MSElang soll ermöglichen, hocheffizienten Code zu schreiben. Wenn man innerhalb der BMP zur Zeichendarstellung mit WideChar arbeiten kann statt mit String arbeiten zu müssen, ist dies ein Vorteil.
@mschnell:
Das sehe ich auch so.
@mschnell:
Das sehe ich auch so.
-
- Beiträge: 586
- Registriert: Mi 25. Mär 2009, 21:12
- OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
- CPU-Target: mostly 32 bit
Re: MSElang, der zukünftige Compiler für MSEide+MSEgui
Das ist doch genau der Punkt.mse hat geschrieben:Dann zeige doch bitte wie gross der Anteil an Umlautproblem-Themen im Deutschen Lazarusforum ist, welche ebenfalls bestehen würden, wenn Lazarus UnicodeString statt "utf-8 in AnsiString ohne BOM oder {$codepage utf8} oder -Fcutf8" verwenden würde. Ich vermute der Anteil ist gering.martin_frb hat geschrieben: Die meisten Programmierer sind doch an Zeichen interessiert. Einige wissen nicht mal was ein Codepoint ist.
Und in Sachen Zeichen, ist UTf16 nicht besser als UTF8. Es erweckt lediglich *oberflächlich* den Eindruck, das es besser wäre.
In UTF16 tritt de Fehler seltener (bei weniger Zeichen/Codepoints) auf. Die meisten Leute bemerken den Fehler bei solchen Zeichen/Codepoints die in UTF16 den Fehler nicht bemerkbar machen.
Nur:
Der Fehler ist deswegen mit UTF16 NICHT behoben. Er existiert noch. Er ist nur besser versteckt.
UTF16 behebt den Fehler nicht, sondern versteckt in nur (in vielen Faellen).
In my (very personal) Opinion:
Es ist NIE gut einen Fehler zu verstecken, statt ihn zu beheben. (Auch nicht fuer den blutigsten Anfaenger)
-
- Beiträge: 586
- Registriert: Mi 25. Mär 2009, 21:12
- OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
- CPU-Target: mostly 32 bit
Re: MSElang, der zukünftige Compiler für MSEide+MSEgui
Wie gesagt, ich will hier niemand überzeugen. Weder fuer noch gegen UTF8/16mse hat geschrieben:MSElang soll ermöglichen, hocheffizienten Code zu schreiben. Wenn man innerhalb der BMP zur Zeichendarstellung mit WideChar arbeiten kann statt mit String arbeiten zu müssen, ist dies ein Vorteil.
@mschnell:
Das sehe ich auch so.
Ich wuerde nur gern die Motivation fuer utf16 verstehen.
Wenn der Anwender sich im klaren ist, das er unvollständiges/Fehlerhaftes utf handling programmiert, dann ist das OK.
Das Risiko das der Fehler sich auswirkt, ist ja in utf16 geringer. Wer das Rest Risiko akzeptieren will, kann das tun.
Ich denke nur, das in UTF16 weniger Programmierer überhaupt erst erkennen, das es dieses Risiko gibt
-
- 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: MSElang, der zukünftige Compiler für MSEide+MSEgui
Dann nochmals, in welchen Themen im Deutschen Lazarusforum mit Umlautproblemen würden die Programmierer ein Risiko eingehen, wenn Lazarus UnicodeString statt "utf-8 in AnsiString ohne BOM oder {$codepage utf8} oder -Fcutf8" verwenden würde? Wo liegt beimartin_frb hat geschrieben: Ich denke nur, das in UTF16 weniger Programmierer überhaupt erst erkennen, das es dieses Risiko gibt
Code: Alles auswählen
if str1[5] = 'ä' then begin
-
- 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: MSElang, der zukünftige Compiler für MSEide+MSEgui
Deshalb habe ich schon ganz zu Anfang darauf hingewiesen, dass das Verhalten der Strings ordentlich dokumentiert werden muss und dabei auf eventuelle Probleme hingewiesen wird.martin_frb hat geschrieben:Es ist NIE gut einen Fehler zu verstecken, statt ihn zu beheben. (Auch nicht fuer den blutigsten Anfaenger)
-Michael
Zuletzt geändert von mschnell am Di 5. Nov 2013, 13:02, insgesamt 1-mal geändert.
-
- 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: MSElang, der zukünftige Compiler für MSEide+MSEgui
Wenn aus irgendwelchen obskuren Gründen das ä im String ein zusammengesetzter UTF-16 Code ist (a + Pünktle drüber).mse hat geschrieben: Wo liegt beidas Risiko?Code: Alles auswählen
if str1[5] = 'ä' then begin
Außerdem: macht man
Code: Alles auswählen
if str1[5] = smily then begin
Das Problem ist also noch mehr der Char-Type als der String-Typ.
(wird in meinen Anwendungen vermutlich nie vorkommen.)
-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: MSElang, der zukünftige Compiler für MSEide+MSEgui
Das ist unabhängig davon, ob str1 in utf-8 oder utf16 ist. Zudem wird nicht nach "a+Pünktle drüber" gesucht sondern nach 'ä'.mschnell hat geschrieben: Wenn aus irgendwelchen obskuren Gründen das ä im String ein zusammengesetzter UTF-16 Code ist (a + Pünktle drüber).
Ich nehme an <smily> ist nicht in der BMP. Dann reklamiert der Compiler für eine '<smily>' Konstante.Außerdem: macht manCode: Alles auswählen
if str1[5] = smily then begin
Auch hier reklamiert der compiler. An ein UnicodeChar kann kein UnicodeString zugewiesen werden. Zudem handelt es sich ja um die Suche nach *bekannten* Zeichen (war das jetzt das 15.mal?)mit einer Variable smily, die der passende (UTF16) Character-Typ ist und versucht vorher auf smily etwas zuzuweisen, geht das schief, wenn es ein zusammengesetzter UTF16 Code ist,

-
- 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: MSElang, der zukünftige Compiler für MSEide+MSEgui
.. und auch in UTF32 / UC4mse hat geschrieben:Das ist unabhängig davon, ob str1 in utf-8 oder utf16 ist.
Absolut korrekt. Das ist ein allgemeines Unicode Problem:
Sind die beiden Strings "ä" und "a plus Pünktle" gleich, obwohl sie (in jeder Codierung, sie ich kenne) unterschiedlich lang sind. ???
Wer sich auf zusammengesetzte Zeichen einlässt, muss wissen, was er tut. Ein Anfänger, dem das passiert ist mit Mitteln der Sprache wohl nicht zu helfen.
-Michael
-
- 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: MSElang, der zukünftige Compiler für MSEide+MSEgui
Wenn man einen risikofreien anfängerfreundlichen Stringtyp haben will, wäre wohl UTF-32 die richtige Wahl. UTF-16 funktioniert für Texte mit manchen Smylies nicht so wie es ein Anfänger erwarten würde.mse hat geschrieben: Dann nochmals, in welchen Themen im Deutschen Lazarusforum mit Umlautproblemen würden die Programmierer ein Risiko eingehen, wenn Lazarus UnicodeString statt "utf-8 in AnsiString ohne BOM oder {$codepage utf8} oder -Fcutf8" verwenden würde?
Ich denke UTF-16 ist für Anfänger nur scheinbar besser als UTF-8 (weniger sichtbar verbuggt) - und für Experten ist es schlecht.
Wie bereits erwähnt, passt auf UTF-32 die Bezeichnung "UnicodeString" wesentlich besser. Man hätte dann auch einen Character Typ, der auch das bedeutet was man von ihm denkt.
Soweit ich sehe sieht es so aus:
- Leute, die es einfach haben wollen benutzen UTF-32
- Leute, die es effizient haben wollen benutzen UTF-8
- Leute, die sich gerne mit der Windows-API unterhalten oder gerne halb-verbuggten Code schreiben nehmen UTF-16.
-
- 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: MSElang, der zukünftige Compiler für MSEide+MSEgui
Nee "UnicodeString" sollte sich nur ein Code aware String-Typ nennen dürfen, der in jeder Kodierung korrekt arbeitet. Fest codierte Strings sollten ehrlicherweise auch so heißen: "UTF8String", "UTF16String", "UTF32String"Patito hat geschrieben:Wie bereits erwähnt, passt auf UTF-32 die Bezeichnung "UnicodeString" wesentlich besser. Man hätte dann auch einen Character Typ, der auch das bedeutet was man von ihm denkt.
Blödsinn !Patito hat geschrieben:- Leute, die sich gerne mit der Windows-API unterhalten oder gerne halb-verbuggten Code schreiben nehmen UTF-16.
Betriebssystem-API Aufrufe sind bei fast allen Anwendungen zeitlich so selten, und die Strings i.A. so kurz, dass das ein Umcodieren an dieser Stelle kaum auffällt.
Die diskutierten Probleme treten bei allen Codierungs-Arten auf. Man kann nur Platz- und Performance-Verschwendung gegen die Wahrscheinlichkeit, dass es einen trifft, austartieren. Und dabei ist UTF-16 - je nach Geschmack - ein relatives Optimum. UTF32 natürlich auch. UTF-8 ist nur optimal, wenn es hauptsächlich auf minimalen Platzbedarf ankommt, man aber unbedingt (warum auch immer) Unicode machen möchte, obwohl lokale-abhängiges 8 Bit ANSI eigentlich alle Anforderungen erfüllt.
-Michael
-
- Beiträge: 586
- Registriert: Mi 25. Mär 2009, 21:12
- OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
- CPU-Target: mostly 32 bit
Re: MSElang, der zukünftige Compiler für MSEide+MSEgui
Nochmals:mse hat geschrieben:Dann nochmals, in welchen Themen im Deutschen Lazarusforum mit Umlautproblemen würden die Programmierer ein Risiko eingehen, wenn Lazarus UnicodeString statt "utf-8 in AnsiString ohne BOM oder {$codepage utf8} oder -Fcutf8" verwenden würde? Wo liegt beimartin_frb hat geschrieben: Ich denke nur, das in UTF16 weniger Programmierer überhaupt erst erkennen, das es dieses Risiko gibtdas Risiko?Code: Alles auswählen
if str1[5] = 'ä' then begin
Die meisten Probleme die Leute mit UTF8 posten, , wuerden Sie unter UTF16 nicht bemerken.
Das ist korrekt. Und das scheint ja auch der Hintergrund deiner Referenz zu den "Problemen im Forum"?
Dann bleibt die Frage:
Die Probleme entstehen, weil der Code fehlerhaft ist. Wenn nun entsprechender Code mit UTF16 geschrieben wird, ist er dann Fehlerfrei?
Ich sage NEIN.
ABER, das haengt davon ab, wie man den Fehler interpretiert>
Wenn ein Programmierer (in UTF8 oder 16) schreibt
Code: Alles auswählen
if str1[5] = 'ä' then begin
Was will er eigentlich das sein Programm machen soll?
A) Testen auf den Buchstaben 'ä'
B) Testen auf den CodePoint fuer die normalisierte Repräsentation von 'ä'
Wenn er (B) will (und das setzt voraus, er kennt den Unterschied zwischen A und B), also wenn er B will, dann hast du Recht, UTF 16 loest das Problem.
Wenn er A will (und das beinhaltet "wenn er den unterschied zwischen A und B NICHT kennt; denn B kann nur wollen wer weiss, das es B gibt, und wer das weiss kennt auch den Unterschied). Also wenn er A will, dann hilft im UTF16 eben nicht. [1]
Und, wenn er A will, weil er eben den Unterschied nicht kennt, dann ist UTF 16 gar nicht hilfreich. Denn UTF 16 versteckt den Fehler, und laesst Ihn in dem Glauben, er habe die korrekte Loesung fuer A. Hat er aber nicht.
Mit UTF8 kriegt er nen Fehler. Er wird dann fragen oder googeln. Er hat ein Chance sein wissen zu erweitern (Ob er es tut, und ob er es ausreichend erweitert, ist natuerlich auch in diesem Fall nicht garantiert).
Also
UTF8: Fehler, dann Chance wissen zu erlangen
UTF16: Meist kein Fehler [1], daher auch keine Chance Wissen zu erlangen.
[1] Weil wenn er zum Beispiel texte aus Dateien oder Datenbanken oder Webseiten nach 'ä' durchucht, wird irgendwann mal ein Text dabei sein in dem das 'ä' NICHT normalisiert ist.
--------------------
Bleibt als letztes:
Viele Programmierer die den Unterschied zwischen A und B kennen, entscheiden sich dann eh dafuer, das Problem mit nicht normalisierten Zeichen zu ignorieren.
Wenn sich der Programmierer dafuer entscheidet, dann ist UTF16 wieder besser.
Aber dafuer muss er eben erst den unterschied kennen.....
Und: Viele != Alle