system.insert zählt falsch bei Umlauten [gelöst]
-
- Beiträge: 238
- Registriert: So 13. Dez 2009, 09:43
- OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
- CPU-Target: x86 64Bit
- Wohnort: Niederösterreich
system.insert zählt falsch bei Umlauten [gelöst]
Hallo
Ich versuche ein Sonderzeichen mittels Button in den Text eines TEdit einzufügen.
Die Cursorposition hole ich mir über Edit1.SelStart + Edit1.SelLength
Funktioniert auch tadellos, solange kein Sonderzeichen (z.B. Umlaut) vor der Einfügeposition im Text ist.
Dann verzählt sich system.insert, da anscheinend ein Umlaut als zwei Zeichen gezählt wird.
Gibt es da eine einfache Lösung?
fG
Christian
Ich versuche ein Sonderzeichen mittels Button in den Text eines TEdit einzufügen.
Die Cursorposition hole ich mir über Edit1.SelStart + Edit1.SelLength
Funktioniert auch tadellos, solange kein Sonderzeichen (z.B. Umlaut) vor der Einfügeposition im Text ist.
Dann verzählt sich system.insert, da anscheinend ein Umlaut als zwei Zeichen gezählt wird.
Gibt es da eine einfache Lösung?
fG
Christian
Zuletzt geändert von AlterMann am Do 6. Sep 2012, 18:54, insgesamt 1-mal geändert.
Früher war alles besser. Und aus Holz!
-
- 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: system.insert zählt falsch bei Umlauten
Offensichtlich arbeitet system.insert mit UTF-8 Codierung und die Position ist in Bytes und nicht in darstellbaren Zeichen angegeben.
Das ist kein Bug, sondern ein Feature.
Wie es aussieht, wird sich dieses Verhalten in irgendeiner späteren Version von Lazarus ändern.
-Michael
Das ist kein Bug, sondern ein Feature.
Wie es aussieht, wird sich dieses Verhalten in irgendeiner späteren Version von Lazarus ändern.
-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: system.insert zählt falsch bei Umlauten
Nein, das wird sich nicht aendern. (Soweit ich weiss).mschnell hat geschrieben:Offensichtlich arbeitet system.insert mit UTF-8 Codierung und die Position ist in Bytes und nicht in darstellbaren Zeichen angegeben.
Das ist kein Bug, sondern ein Feature.
Wie es aussieht, wird sich dieses Verhalten in irgendeiner späteren Version von Lazarus ändern.
Auch wenn FPC einen echten UTF8-string hat besteht das problem.
In LazUtils (oder LCLProc/Intf) gibt es Proceduren wie Utf8Copy, Utf8Length, vielleicht auch Utf8Insert...
Mit denen geht das. Allerdings wenn viele Zeichen bearbeitet werden: Sehr langsam!
> EDIT
> Utf8Copy and co arbeiten mit codepoints. D.h fuer Zeichen aus mehreren Codepoints ist der index auch falsch
>
Es geht ebenfalls (fast, nicht wirklich immer), wen vorher in widestring umgewandelt wird.
Das normale Insert (fuer nicht widestring, das ist fuer ALLE 1 byte basierten strings (und utf8 ist 1 byte basiert)) wird sich nicht aendern.
Ebenso funktioniert s[x] nicht.
s[x], insert, copy, ... arbeiten mit Bytes (word, wenn widestring). Nicht mit Zeichen.
In ANSI (Europe): Zeichen = Byte
In Utf8: Zeichen = 1 oder mehr Codepoints / Codepoint = 1 oder mehr Bytes
In Utf16 (widestring): Zeichen = 1 oder mehr Codepoints / Codepoint = 1 word
Zuletzt geändert von martin_frb am Do 6. Sep 2012, 12:39, insgesamt 2-mal geändert.
Re: system.insert zählt falsch bei Umlauten
S.a. hier
http://wiki.freepascal.org/LCL_Unicode_ ... characters" onclick="window.open(this.href);return false;
http://wiki.freepascal.org/LCL_Unicode_ ... characters" onclick="window.open(this.href);return false;
-
- 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: system.insert zählt falsch bei Umlauten
Mail von Florian Klämpfl (der oberste FP-Guru): im fpc-developers-Forum unuter dem Betreff "Unicode resouirce strings:martin_frb hat geschrieben: Nein, das wird sich nicht aendern. (Soweit ich weiss).
Wir können also ziemlich sicher sein, dass die zukünftige FPC-Version 2.8 auf Delphi-kompatible UTF-16 Strings umschwenken wird. Lazarus wird diesem Trend folgen müssen.Am 20.08.2012 20:27, schrieb Graeme Geldenhuys:
>
>>> * UnicodeString is always UTF-16 (so everything but Windows takes a
>>> conversion penalty)!
>>
>> A decision has been made and you are not happy with it. Fine. But before
>> you called the fpc team being in a deadlock?
>
> Many things by the FPC team get discussed or debated behind closed
> doors, so how are we even in the fpc-devel mailing list to know what
> is decided. Last I read in fpc-devel it was still heavily debated and
> no decision was in sight. I guess now we know, the decision is UTF-16
> everywhere where UnicodeString is used.
Actually, you overestimate what the "FPC team" can decide. The
"decision" was more like: somebody popped up and proposed to implement
Unicodestring support in a D2009+ compatible way without breaking too
much legacy stuff. So we could say, ok, we merge this into fpc's svn.
The alternative would have been to say no, we leave things as they are:
"deadlock".
The current situation is:
- either somebody starts to implement support for unicodestring being
utf-8 (or whatever) on linux in a compatible way with the current
approach, then 2.8.0 will use this
- nobody works on it, then 2.8.0 comes with unicodestring=utf-16 always.
Ob wir das nun gut finden oder nicht. Es wird sich ändern.
-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: system.insert zählt falsch bei Umlauten
Utf16 hat aber auch combound chars . Problem existiert immer noch.mschnell hat geschrieben:martin_frb hat geschrieben: Ob wir das nun gut finden oder nicht. Es wird sich ändern.
Der unterschied: Es faellt beim testen nicht mehr unbedingt auf. Der Fehler-report kommt irgendwann spaeter vom end user
-
- 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: system.insert zählt falsch bei Umlauten
So ist es. Ich habe auch nicht gesagt, dass sich das (oder ein ähnliches) Problem dann in Luft auflöst. Aber es wird eben anders und wenn man jetzt eine Lösung findet, kann sie dann wieder entweder unnötiger Overhead sein oder nicht mehr funktionieren.martin_frb hat geschrieben:Utf16 hat aber auch combound chars . Problem existiert immer noch.
-
- 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: system.insert zählt falsch bei Umlauten
Sorry aber ich versteh da was nicht. Gegeben ist ein bestimmtes Problem. Was hilft oder interessiert "Es wird anders" wenn das Problem trotzdem bleibt?mschnell hat geschrieben:So ist es. Ich habe auch nicht gesagt, dass sich das (oder ein ähnliches) Problem dann in Luft auflöst. Aber es wird eben anders und wenn man jetzt eine Lösung findet, kann sie dann wieder entweder unnötiger Overhead sein oder nicht mehr funktionieren.martin_frb hat geschrieben:Utf16 hat aber auch combound chars . Problem existiert immer noch.
Es wird auch anders, wenn ich ein array of byte verwende... Aber helfen tut das gar nicht (und interessieren auch nicht, jedenfalls mich nicht in diesem Kontext). Aber vielleicht übersehe ich ja was. Viele FIrmen glauben ja auch das Bugs nur dann gefixt werden muessen, wenn Sie bei einem sehr grossem Anteil der Nutzer regelmäßig auftreten.
Sorry for exaggerating a bit...
-
- 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: system.insert zählt falsch bei Umlauten
Hab ich doch erklärt. Da (vermutlich irgendwann) eine Änderung der LCL ansteht, ist eine Lösung, die jetzt für das Problem gefunden wird, möglicherweise mit einer späteren Version von Lazarus nicht mehr kompatibel. (Das ist einfach nur eine Feststellung, wer das Problem lösen will soll das ruhig machen und abwarten, was passiert, wenn er auf eine später Lazarus-Version upgradet. Man sollte aber wissen, dass das es an dieser Stelle später unvermittelt zu neuen Problemen kommen kann.)
-Michael
-Michael
Zuletzt geändert von mschnell am Do 6. Sep 2012, 19:34, insgesamt 1-mal geändert.
-
- 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: system.insert zählt falsch bei Umlauten
Ah verstehe. Der teil war mir entgangen.
Aber was sind die alternativen? ....
Aber was sind die alternativen? ....
Re: system.insert zählt falsch bei Umlauten
Das ist mschnell normalerweise egal. Er "hat" die Probleme auch nicht wirklich, weil er ganz offenichtlich nicht mehr selber programmiert.martin_frb hat geschrieben: Aber was sind die alternativen? ....
Er findet es einfach lustig, vor Unicode Problemen zu warnen und irgend ein Geschwurbel darüber von sich zu geben.

-
- Beiträge: 238
- Registriert: So 13. Dez 2009, 09:43
- OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
- CPU-Target: x86 64Bit
- Wohnort: Niederösterreich
Re: system.insert zählt falsch bei Umlauten [gelöst]
Danke schön für eure Tipps und die rege Beteiligung.
UTF8insert aus der Unit Lazutf8 macht alles richtig.
Nochmals Danke
Christian
UTF8insert aus der Unit Lazutf8 macht alles richtig.
Nochmals Danke
Christian
Früher war alles besser. Und aus Holz!
-
- 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: system.insert zählt falsch bei Umlauten
1) Delphi alt (locale-basiertes ANSI)martin_frb hat geschrieben:Aber was sind die alternativen? ....
2) Delphi aktuell (UTF-16)
3) mseIDE (UTF-16)
4) Lazarus alt ((locale-basiertes ANSI)
5) Lazarus aktuell (UTF-8)
6) warten auf Lazarus zukünftig (UTF-16)
Es gibt sicher noch weitere Möglichkeiten Pascal zu programmieren
(Die Reihenfolge soll keine Bewertung darstellen. Hat alles Vor- und Nachteile.)
-Michael
Zuletzt geändert von mschnell am Do 6. Sep 2012, 20:21, 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: system.insert zählt falsch bei Umlauten [gelöst]
Prima. Ich freue mich dass es für Dich funktioniert.AlterMann hat geschrieben:UTF8insert aus der Unit Lazutf8 macht alles richtig.
Man kann ja im Moment nicht voraussagen ob/wann es dann (bei einer Neu-Übersetzung mit dem dann aktuellen Lazarus entweder nicht mehr funktioniert oder unnötigen Overhead erzeugt (was vermutlich nicht besonders schlimm wäre).
-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: system.insert zählt falsch bei Umlauten
Doch, jede Menge, aber natürlich nicht mit Lazarus, das ist bei mir bis auf weiteres in der Testphase.theo hat geschrieben: weil er ganz offenichtlich nicht mehr selber programmiert.
