AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Pos() oder AnsiPos()?

Ein Thema von blackdrake · begonnen am 14. Dez 2008 · letzter Beitrag vom 2. Jul 2009
Antwort Antwort
Seite 1 von 2  1 2   
blackdrake

Registriert seit: 22. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#1

Pos() oder AnsiPos()?

  Alt 14. Dez 2008, 23:16
Hallo.

Ich bin mal wieder am Überarbeiten meiner Codes.

Mir ist Letztens folgendes aufgefallen: Ich habe stets UpperCase(), LowerCase() oder z.B. Pos() verwendet. Es gibt aber zu all diesen Funktionen auch die Ansi-Varianten, wie z.B. AnsiPos().

Nun, der Vorteil an AnsiUpperCase() ist z.B. dass es MBCS (= Unicode?) unterstützt. Außerdem werden auch deutsche Umlaute wie z.B. das ä behandelt.

Nun stellt sich die Frage: Wenn die Ansi-Varianten also "besser" sind, wieso sollte man die Nicht-Ansi-Varianten überhaupt noch verwenden? (Sehen wir mal von Inkompatibilitäten bezüglich groß- oder nicht-groß- geschriebenen äöü ab)

Außerdem:
1. Wieso meldet Delphi z.B. das Symbol Pos() nicht als veraltet?
2. Wieso hat Delphi trotzdem noch Code für z.B. Pos() implementiert und leitet nicht auf AnsiPos() um?

Delphi-Quellcode:
function Pos(const Substr, S: string): Integer;
begin
  result := AnsiPos(Substr, S);
end;
Ist es legitim, alle Codes, die ich z.B. aus der CodeLib übernommen habe, innerhalb meines Projektes einfach Pos() -> AnsiPos() umzuwandeln, um bei einem eventuellen Delphi 2009 Umstieg möglichst Unicode-Ready zu sein?

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

Re: Pos() oder AnsiPos()?

  Alt 15. Dez 2008, 00:26
UpperCase und LowerCase nutzt man dann wenn man Geschwindigkeit braucht und nur den ASCII Zeichensatz verwendet.

AnsiPos und Pos arbeiten in Delphi 2009 gleich, nur das Pos schneller ist weil ein besserer Algorithmus verwendet wird.

Ich habe AnsiPos noch nie verwendet, da ich nur für westliche Sprachen programmiere und diese keine MBCS nutzen und somit alle Char eindeutig sind. Mit Unicode ist das aber hinfällig, weil dort jeder Char auch für östliche Sprachen eindeutig ist.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.125 Beiträge
 
Delphi 12 Athens
 
#3

Re: Pos() oder AnsiPos()?

  Alt 15. Dez 2008, 01:45
Bei Pos ist es so, das dort automatisch die passende Version für AnsiString oder WideString gewählt wird.

Wenn du deinen "String" als String definierst, wird dort Seit Delphi 2009 standardmäßig Unicode (WideString) verwendet ... in den früheren Delphi-Versionen ist es AnsiString.
Ebenso ist es mit Char. (D09 = WideChar und davor AnsiChar)

In der WinAPI ist es ebenso geregelt ... dort gibt es Ansi- (abcA), Unicode- (abcW) und die Standard-Versionen (abc), wobei Letztere wiederrum entsprechend der umgebung auf die Ansi- oder UnicodeVersionen umgeleitet werden.


Also, mit den von dir "alt" genannten Versionen kann man ein Programm erstellen und dann erst später, beim Compilieren, entscheiden, ob es ein Ansi- oder Unicode-Programm werden soll.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
blackdrake

Registriert seit: 22. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#4

Re: Pos() oder AnsiPos()?

  Alt 15. Dez 2008, 01:48
Heißt das, Pos() wird bei Delphi2009 einen WideString, also Unicode-String korrekt behandeln, AnsiPos() aber nicht? Dann wäre ja Pos() wieder die bessere Wahl, oder?

Und wie ist es bei AnsiUpperCase()? Mir scheint es, als ob das die "bessere" Variante wäre, weil äöü uppercas'ed wird im Gegensatz zu UpperCase().
Daniel Marschall
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.125 Beiträge
 
Delphi 12 Athens
 
#5

Re: Pos() oder AnsiPos()?

  Alt 15. Dez 2008, 01:56
hatte oben noch was zueditiert (wärend du schriebst)


Nja, eigentlich wäre es schönder, wenn Delphi standardmäßig (vor D09) an die "richtigen" Ansi-Versionen umleiten würde.

Also Pos an AnsiPos ... leider macht es dieses nicht immer so


Wenn du aus jeden Fall nur mit ANSI arbeiten willst, dann währe theoretisch AnsiPos und Co. wohl die bessere Wahl ... aber wenn du dann doch mal auf Unicode umstellen willst, dann mußt du dann alles auf Unicode umschreiben.


Selber arbeite ich oft direct mit den Unicode-Versionen (außer Pos, denn dieses wird bei einem UnicodeString richtig an die UnicodeVersion weitergeleitet) ... arbeite schon seit Delphi 7 oftmals mit Unicode (siehe FileSplitter und Co.).

Wenn es dir nicht auf den Speicher ankommt, wäre es dann wohl doch besser statt die Ansi-Versionen direkt zu verwenden die UnicodeVersionen zu verwenden (dort hat man dann volle Unterstützung für Unicode und keine Probleme mit CodePages und Co.)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.859 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Pos() oder AnsiPos()?

  Alt 15. Dez 2008, 06:33
Aber String (ab D2009) = UnicodeString <> WideString
Markus Kinzler
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7

Re: Pos() oder AnsiPos()?

  Alt 15. Dez 2008, 12:29
  • Pos(string)
    Delphi 2009: Korrektes Unicode
    Delphi 2007: auf Byte-Basis
  • Pos(AnsiString)
    Delphi 2009: auf Byte-Basis (Vorsicht, Delphi bevorzugt Pos(string) bei Stringliteralen)
    Delphi 2007: auf Byte-Basis
  • AnsiPos(string)
    Delphi 2009: Korrektes Unicode (langsamerer Algorithmus als Pos(string))
    Delphi 2007: Korrektes ANSI
  • AnsiPos(AnsiString)
    Delphi 2009: Korrektes ANSI
    Delphi 2007: Korrektes ANSI
  • UpperCase(string)
    Delphi 2009: ASCII (Zeichen #0..#128 werden konvertiert, Umlaute gehören nicht dazu)
    Delphi 2007: ASCII (Zeichen #0..#128 werden konvertiert, Umlaute gehören nicht dazu))
  • UpperCase(AnsiString)
    Delphi 2009: ASCII (Zeichen #0..#128 werden konvertiert, Umlaute gehören nicht dazu)
    Delphi 2007: ASCII (Zeichen #0..#128 werden konvertiert, Umlaute gehören nicht dazu))
  • AnsiUpperCase(string)
    Delphi 2009: Korrektes Unicode
    Delphi 2007: Korrektes ANSI
  • AnsiUpperCase(AnsiString)
    Delphi 2009: Korrektes ANSI
    Delphi 2007: Korrektes ANSI
  • LowerCase/AnsiLowerCase wie UpperCase/AnsiUpperCase
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.125 Beiträge
 
Delphi 12 Athens
 
#8

Re: Pos() oder AnsiPos()?

  Alt 15. Dez 2008, 13:06
Zitat von jbg:
  • AnsiPos(string)
    Delphi 2009: Korrektes Unicode (langsamerer Algorithmus als Pos(string))
    Delphi 2007: Korrektes ANSI
eigentlich hätt ich vermutet das für D09 müßte falsch sein, da Ansi Ansi entgegennimmt,
aber statt AnsiString in der Definition find ich was Anderes
function AnsiPos(const Substr, S: string): Integer;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
blackdrake

Registriert seit: 22. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#9

Re: Pos() oder AnsiPos()?

  Alt 15. Dez 2008, 17:02
Hallo.

jbg, danke für diese sehr ausführliche und Übersichtliche Auflistung.

Ok, dann bleibe ich bei den Ansi* Varianten mit den Delphi-Strings (also dem Typ "String").

Damit bin ich bei Delphi 2009 Unicode-Ready und bei Delphi 2007- kompatibel bezüglich Umlauten.

Schade, dass Delphi 2009 bei AnsiPos() und Pos() das selbe Verhalten hat, aber AnsiPos() langsamer ist. Aber das ist irgendwie nicht mein Problem, da Delphi 2009 ja die Funktion einfach als Alias umleiten könnte. Deswegen plage ich mich nicht extra mit Compilerschaltern rum. Es kommt bei meinen Pos-Aufrufen auch nicht auf jede Millisekunden an, da ich nicht mit großen Datenmengen arbeite.

PS: Gibt es eine Erklärung, wieso Delphi 2009 bei Pos() und AnsiPos() scheinbar GLEICHE Funktionen, aber unterschiedlich schnelle Algorithmen verwendet? Ist das Verhalten vielleicht doch nicht identisch? Oder haben die den Alias der Funktion AnsiPos -> Pos wirklich vergessen?

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#10

Re: Pos() oder AnsiPos()?

  Alt 15. Dez 2008, 18:28
Zitat von blackdrake:
Damit bin ich bei Delphi 2009 Unicode-Ready und bei Delphi 2007- kompatibel bezüglich Umlauten.
Wenn du (wie ich weiter oben bereits geschrieben habe) dein Programm nur in westlichen Sprachen (Englisch, Deutsch, Französisch, Italienisch, Spanisch, ...) vertreibst, dann kannst du auch Pos() für Umlaute hernehmen, da die CodePage keine Multi-Byte Sequenzen hat.

Zitat:
PS: Gibt es eine Erklärung, wieso Delphi 2009 bei Pos() und AnsiPos() scheinbar GLEICHE Funktionen, aber unterschiedlich schnelle Algorithmen verwendet?
Klar gibt es eine Erklärung: AnsiPos(string) wurde von AnsiPos(AnsiString) kopiert und dann auf Unicode umgeschrieben. Pos(string) wurde von Pos(AnsiString) kopiert und der Assemblercode dann an Unicode angepasst. UTF16 hat nun mal den Vorteil, dass man sich durch die Char-Sequenz angeln kann ohne dass man Probleme bekommt, wenn man auf ein High oder Low Surogate Zeichen stößt. Bei ANSI ist das (leider) nicht der Fall. Wenn man da mitten im String anfängt, kann es sein, dass man ein LeadByte übersieht und der ganze String falsch interpretiert wird.

Zitat:
Ist das Verhalten vielleicht doch nicht identisch?
Es ist identisch dank UTF16.

Zitat:
Oder haben die den Alias der Funktion AnsiPos -> Pos wirklich vergessen?
Das glaube ich auch. AnsiPos(string) versucht immer gleich den gesamten String für jedes Zeichen zu vergleichen, wohingegen Pos() erstmal das erste Zeichen sucht und dann einen Gesamt-Vergleich durchführt.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:02 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz