Darum habe ich im Deutschen Lazarus Forum auch bestimmt schon mehr als 10 mal geschrieben: bei der Suche nach bekannten Zeichen. Die können bei utf-8 zwischen #$00 und #$7f liegen, bei utf-16 zwischen #$0000 und #$d7ff. Das funktioniert auch wenn sich im utf-8 string mehrbyte codepoints und im utf-16 string surrogate pairs befinden. Ist das nicht deutlich genug?Patito hat geschrieben: Gut. Der Index funktioniert für UCS-2. Für UTF-16 funktioniert er eben leider nicht... da kann man das Wort Basic Multilingual Plane so oft schreiben wie man will, für UTF-16 funktioniert der Index trotzdem nicht.
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: 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
UTF16 mit entsprechender Doku finde ich pragmatisch. UTF8 ohne ernsthafte Warnung in der Doku in einem Datentyp, der auch noch verwirrender Weise ANSIString heißt, finde ich nicht pragmatisch, eben weil nicht nur Smilies, sondern auch einfache Umlaute nicht gleichzeitig mit explizitem Index auf einen String verwendet werden können.theo hat geschrieben:Seit wann interessierst du dich für pragmatische Lösungen? :
-Michael
Zuletzt geändert von mschnell am Mo 4. Nov 2013, 19:39, 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
Stimmt, wenn alle beteiligten "Zeichen" in Strings gespeichert sind (pos(), copy(), ...)mse hat geschrieben:Suche nach bekannten Zeichen. Die können bei utf-8 zwischen #$00 und #$7f liegen, bei utf-16 zwischen #$0000 und #$d7ff. Das funktioniert auch wenn sich im utf-8 string mehrbyte codepoints und im utf-16 string surrogate pairs befinden. Ist das nicht deutlich genug?
Wenn das Zeichen in einem Character-Typ erwartet wird oder gespeichert werden soll, (der natürliche so viele Bits hat, wie ein Code in dem zugehörigen String-Typ), funktioniert das eben nicht.
Das ist bei UTF-8 quasi immer katastrophal, bei UTF-16 fällt es in den meisten praktischen Anwendungen nicht ins Gewicht.
-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
Was ihr damit meint ist mir nicht so recht klar. Das ganze klingt vom Anwendungsfall jetzt etwas speziell und etwas anders als das Argument aus meinem ursprünglichen Zitat.
Aber egal. Wenn ich z.B. in Pascal-Quellcode nach einem bekannten ASCII-Keyword suche, ist das in UTF-8 und UTF-16 eine Suche von einem Haufen Bytes in einem anderen Haufen Bytes. So einen klareren Vorteil Richtung UTF-16 kann ich da nicht finden.
UTF-16 ist insgesamt etwas schwergewichtiger (der Haufen ist oft um den Faktor 2 größer), dafür gehen dann eben manche Suchfunktionen einen Tick schneller.
Für mich ist es praktisch so, dass die Operationen, bei denen UTF-16 schlechter ist praktisch immer gemacht werden müssen (Konvertierung beim einlesen + doppelter Speicherverbrauch - doppelt so viele Bytes kopieren + Konvertierung von ASCII zu UTF-16) - und die theoretischen Vorteile von UTF-16 in manchen Algorithmen dagegen dann recht klein aussehen.
Aber egal. Wenn ich z.B. in Pascal-Quellcode nach einem bekannten ASCII-Keyword suche, ist das in UTF-8 und UTF-16 eine Suche von einem Haufen Bytes in einem anderen Haufen Bytes. So einen klareren Vorteil Richtung UTF-16 kann ich da nicht finden.
UTF-16 ist insgesamt etwas schwergewichtiger (der Haufen ist oft um den Faktor 2 größer), dafür gehen dann eben manche Suchfunktionen einen Tick schneller.
Für mich ist es praktisch so, dass die Operationen, bei denen UTF-16 schlechter ist praktisch immer gemacht werden müssen (Konvertierung beim einlesen + doppelter Speicherverbrauch - doppelt so viele Bytes kopieren + Konvertierung von ASCII zu UTF-16) - und die theoretischen Vorteile von UTF-16 in manchen Algorithmen dagegen dann recht klein aussehen.
-
- 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
Bei *bekannten* Zeichen schon!!!mschnell hat geschrieben: Stimmt, wenn alle beteiligten "Zeichen" in Strings gespeichert sind (pos(), copy(), ...)
Wenn das Zeichen in einem Character-Typ erwartet wird oder gespeichert werden soll, (der natürliche so viele Bits hat, wie ein Code in dem zugehörigen String-Typ), funktioniert das eben nicht.
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
Genau das meinte ich doch. Bei UTF16 ist 'ä' ein einzelner code, ein Smilie aber nicht. str1[5] ist - auch wenn es ein ä ist, ein 16Bit "Char".mse 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
-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
Nur wenn das ä normalisiert ist. ä kann auch als 2 codepoints a und "2 punkte drüber" gespeichert werden.mse 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
Und während europäisch Zeichen meist eine Normalform haben stimmt das in anderen Sprachen nicht. Im z.B. Arabischen (IIRC) gibt es Zeichen mit mehreren Akzenten, und die sind immer in mehreren codepoints gespeichert (utf8 und utf16 und afaik utf32)
Das heißt string[x] funktioniert nur fuer einen kleinen Teil der Welt. Egal mit welchem utf-n.
Die Tatsache das in UTF16 weniger Zeichen mehr als einen Codepoint brauchen, sehe ich als Nachteil. Der Programmierer hat eine geringere Wahrscheinlichkeit, das er selber beim testen eine fehlende multi-codepoint Unterstützung findet. Der BUG wird erst vom Anwender gefunden.
Ausnahme: EIn Program nur fuer Europa and Amerika, mit 100% Garantie, das wirklich nie, irgendwelche Daten (z.b. Namen) mit multicodepoint Zeichen auftreten. Und das alle Zeichen normalisiert sind
-
- Beiträge: 320
- Registriert: Sa 21. Mär 2009, 17:31
- OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
- CPU-Target: 64 Bit
Re: MSElang, der zukünftige Compiler für MSEide+MSEgui
Das funktioniert auch bei UTF-8, man muss nur etwas castenmse 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
-
- 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 gilt für utf-8 auch. Benutzt du in deinen Programmen die decomposed Form ohne dass du davon weisst? Benutzt ein Anfänger solche Sachen? Ist es für den Anfänger nicht ein Nutzen, wenn er sich nicht schon am ersten Tag um die Fussangeln der Textverarbeitung kümmern muss? Gibt es hier im Deutschen Lazarusforum Themen mit Umlautproblemen, welche in utf-16 ebenfalls auftreten würden?martin_frb hat geschrieben: Nur wenn das ä normalisiert ist. ä kann auch als 2 codepoints a und "2 punkte drüber" gespeichert werden.
Dann sollen wir von einer für uns möglichen Vereinfachung keinen Nutzen haben, weil es Sprachgruppen gibt, die davon nicht profitieren können? Dann müsste man ja konsequenterweise utf-8 zu ASCII inkompatibel machen, da die ASCII Kompatibilität den englischsprechenden Programmierern die Arbeit erleichtert.Und während europäisch Zeichen meist eine Normalform haben stimmt das in anderen Sprachen nicht. Im z.B. Arabischen (IIRC) gibt es Zeichen mit mehreren Akzenten, und die sind immer in mehreren codepoints gespeichert (utf8 und utf16 und afaik utf32)
Zudem werden arabische Programmierer vielleicht auch nach dem Zeichenstamm suchen wollen, mit utf-16 ist das mittels character und Indizierung möglich, mit utf-8 nicht.
string[x]-Suche nach BMP-codepoints funktioniert für utf-16 auf der ganzen Welt. Für utf-8 funktioniert sie nirgends.Das heißt string[x] funktioniert nur fuer einen kleinen Teil der Welt. Egal mit welchem utf-n.
Das ist ein weithergeholtes Argument...Die Tatsache das in UTF16 weniger Zeichen mehr als einen Codepoint brauchen, sehe ich als Nachteil. Der Programmierer hat eine geringere Wahrscheinlichkeit, das er selber beim testen eine fehlende multi-codepoint Unterstützung findet. Der BUG wird erst vom Anwender gefunden.
Beim durchschnittlichen Programmierer besteht durchaus auch die Möglichkeit, dass er mit multi-codeunit handling zusätzliche Fehler macht, welche erst die Anwenderin bemerkt.

-
- 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 zeige mal wie.BeniBela hat geschrieben: Das funktioniert auch bei UTF-8, man muss nur etwas casten
-
- 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
Aber eben in Europa (inklusive Türkei), USA, Südamerika und Australien. Genau das meinte ich mit "pragmatisch aber nicht wirklich Unicode-aware"martin_frb hat geschrieben:Das heißt string[x] funktioniert nur fuer einen kleinen Teil der Welt.

-Michael
-
- Beiträge: 320
- Registriert: Sa 21. Mär 2009, 17:31
- OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
- CPU-Target: 64 Bit
Re: MSElang, der zukünftige Compiler für MSEide+MSEgui
mse hat geschrieben:Dann zeige mal wie.BeniBela hat geschrieben: Das funktioniert auch bei UTF-8, man muss nur etwas casten
Code: Alles auswählen
if PWord(@s[5])^ = PWord(@'ä'[1])^ then
Code: Alles auswählen
if PWord(@s[5])^ = $A4C3 then
-
- 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
Ja utf16 in in Sachen "Codepoint" einfacher.
Aber daraus eine Vereinfachung, oder einen Nutzen abzuleiten ist IMHO weit hergeholt (Genaugenomen: Das Gegenteil. Auf einen nahen Raum begrenzt, den Englisch/Europäischen Sprachraum).
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 Sachen normalisiert vs nicht normalisiert. Sobald Input von außen vorliegt, kann der nicht normalisiert sein.
(Ja die Lazarus IDE handelt das auch nicht, aber UTF16 wuerde das auch nicht fixen)
Und mit Utf8 ist es ggf leichter zu fixen. 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.
-----
Mir ist es ja egal, ob Du utf8 oder UTF16 verwendest. Aber ich habe bisher kein wirklich Argument fuer UTF16 gesehen. Und wenn es eins gibt, wuerde ich es gerne mal kennen.
Das heisst eins gibt es, und ich kenne es:
In UTF8 sind die meisten europäischen Texte weniger Speicherplatz beduerftigt.
IN UTF16 gilt das fuer nicht europäischen Texte, da in anderen Sprachen UTF8 codepoints ggf 3 oder 4 bytes sind, und UTF16 Codepoints nur 2 bytes.
Aber daraus eine Vereinfachung, oder einen Nutzen abzuleiten ist IMHO weit hergeholt (Genaugenomen: Das Gegenteil. Auf einen nahen Raum begrenzt, den Englisch/Europäischen Sprachraum).
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 Sachen normalisiert vs nicht normalisiert. Sobald Input von außen vorliegt, kann der nicht normalisiert sein.
(Ja die Lazarus IDE handelt das auch nicht, aber UTF16 wuerde das auch nicht fixen)
Und mit Utf8 ist es ggf leichter zu fixen. 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.
-----
Mir ist es ja egal, ob Du utf8 oder UTF16 verwendest. Aber ich habe bisher kein wirklich Argument fuer UTF16 gesehen. Und wenn es eins gibt, wuerde ich es gerne mal kennen.
Das heisst eins gibt es, und ich kenne es:
In UTF8 sind die meisten europäischen Texte weniger Speicherplatz beduerftigt.
IN UTF16 gilt das fuer nicht europäischen Texte, da in anderen Sprachen UTF8 codepoints ggf 3 oder 4 bytes sind, und UTF16 Codepoints nur 2 bytes.
-
- 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
>>> if PWord(@s[5])^ = PWord(@'ä'[1])^ then
Igitt. Warum dann nicht gleich alles in Assembler schreiben ?
-Michael
Igitt. Warum dann nicht gleich alles in Assembler schreiben ?
-Michael

Zuletzt geändert von mschnell am Di 5. Nov 2013, 11:37, insgesamt 1-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
Das geht mit {$codepage utf8} vermutlich nicht und läuft für ASCII Zeichen schief.BeniBela hat geschrieben:Code: Alles auswählen
if PWord(@s[5])^ = PWord(@'ä'[1])^ then
Und was ist angenehmer zu programmieren und zu lesenCode: Alles auswählen
if PWord(@s[5])^ = $A4C3 then
Code: Alles auswählen
if PWord(@s[5])^ = $A4C3 then
Code: Alles auswählen
if s[5] = 'ä' then