![]() |
Pos() oder AnsiPos()?
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:
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?
function Pos(const Substr, S: string): Integer;
begin result := AnsiPos(Substr, S); end; Gruß blackdrake |
Re: Pos() oder AnsiPos()?
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. |
Re: Pos() oder AnsiPos()?
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. |
Re: Pos() oder AnsiPos()?
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(). |
Re: Pos() oder AnsiPos()?
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.) |
Re: Pos() oder AnsiPos()?
Aber String (ab D2009) = UnicodeString <> WideString
|
Re: Pos() oder AnsiPos()?
|
Re: Pos() oder AnsiPos()?
Zitat:
aber statt AnsiString in der Definition find ich was Anderes :shock:
Delphi-Quellcode:
function AnsiPos(const Substr, S: string): Integer;
|
Re: Pos() oder AnsiPos()?
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 |
Re: Pos() oder AnsiPos()?
Zitat:
Zitat:
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz