![]() |
Delphi-Version: 2009
Lower/UpperCase beachtet Umlaute nicht
Hallo,
in meinem Delphi 2009 (alle Updates installiert) beachten die Funktion LowerCase & UpperCase aus der Unit SysUtils nicht die deutschen Umlaute (ÖÄÜ). Könnt ihr das reproduzieren? Ich habe mir eigene Funktionen geschrieben, die den Rückgabewert der SysUtils-Funktionen auf Umlaute prüft und ggf. in Groß- bzw. Klein-Buchstaben umwandelt:
Delphi-Quellcode:
CHARACTERS_PRINTABLE_GERMAN_UPPERCASE: Array[0..2] of String = (
'Ä', 'Ö', 'Ü' ); CHARACTERS_PRINTABLE_GERMAN_LOWERCASE: Array[0..2] of String = ( 'ä', 'ö', 'ü' ); ... ... class function TCsString.UpperCase(Str: string): String; var CharIndex: Integer; begin Result := SysUtils.UpperCase(Str); for CharIndex := Low(Self.CHARACTERS_PRINTABLE_GERMAN_LOWERCASE) to High(Self.CHARACTERS_PRINTABLE_GERMAN_LOWERCASE) do Result := Self.Replace(Result, self.CHARACTERS_PRINTABLE_GERMAN_LOWERCASE[CharIndex], self.CHARACTERS_PRINTABLE_GERMAN_UPPERCASE[CharIndex], [rfReplaceAll]); end; class function TCsString.LowerCase(Str: string): String; var CharIndex: Integer; begin Result := SysUtils.LowerCase(Str); for CharIndex := Low(Self.CHARACTERS_PRINTABLE_GERMAN_UPPERCASE) to High(Self.CHARACTERS_PRINTABLE_GERMAN_UPPERCASE) do Result := Self.Replace(Result, self.CHARACTERS_PRINTABLE_GERMAN_UPPERCASE[CharIndex], self.CHARACTERS_PRINTABLE_GERMAN_LOWERCASE[CharIndex], [rfReplaceAll]); end; |
AW: Lower/UpperCase beachtet Umlaute nicht
Du brauchst die
![]() Die ![]() |
AW: Lower/UpperCase beachtet Umlaute nicht
@Bernhard: dein arcadero.com-Link ist futsch, aber über F1 kommt man dort ja auch noch ran, worin ebenfalls das mit den 7 Bit deutlich beschrieben wird.
|
AW: Lower/UpperCase beachtet Umlaute nicht
Warum so kompliziert? Und warum Ansi?
Delphi-Quellcode:
Funktioniert mit komplett Unicode.
lowercase('ÄÖÜ', loUserLocale)
|
AW: Lower/UpperCase beachtet Umlaute nicht
ANSI, weil jemand auf die saudämliche Idee gekommen ist, daß man diese Ansi-Funktionen im 2009 nicht umnennenwollte, wegen der Abwärtkskompatibilität, die man aber sowieso inzwischen vergessen kann.
Aber für das Neuerstellen von Programmen ist das doch echt graußig. Außer bei LowerCase und UpperCase leiten fast alle Funktionen ohne ANSI auf die ANSI-Funktionen weiter. Die WIDE-Funktionen, ala WideLowerCase, sind fast ausschließlich für den WideString implementiert. (siehe Unit WideStrings) In AnsiStrings sind die Funkionen für den AnsiString und in StrUtils/SysUtils liegen die Funktionen für den UnicodeStrings (auch wenn sie ANSI heißen) |
AW: Lower/UpperCase beachtet Umlaute nicht
Ach die Wide-Dinger gibt es auch noch?
Im Quelltext steht, dass die überladene Lowercase im Falle von loUserLocale eine Weiterleitung auf AnsiLowercase ist (ansonsten ist die Funktion in Assembler-Code). AnsiLowercase geht aber trotzdem vernünftig mit Unicode außerhalb von ANSI. AnsiLowercase ruft CharLowerBuffW auf. Da die beiden jetzt also schonmal dasselbe sind, ist jetzt die Frage, was WideLowerCase ist. Unter Windows NT ruft es CharLowerBuffW in user32 auf und unter anderen Betriebssystemen ist es dasselbe wie AnsiLowerCase. Ob D2009-Programme da überhaupt laufen, ist die nächste Frage. Wenn man Türke wär, könnte man mal ausprobieren, inwieweit die beiden Funktionen unter NT mit den türkischen Groß-/Kleinbuchstabenregelungen klarkommen, sprich ob I zu ı wird und i zu İ. Die die aufgerufenen Funktionen fast gleich lauten, dürfte das alles in der Tat jeweils exakt dasselbe sein. |
AW: Lower/UpperCase beachtet Umlaute nicht
Das LowerCase (1 Parameter) ist quasi schon immer nicht auf die WinAPI losgegangen, sondern machte alles selber und auch nur für A-Z. (spontan denk ich da an eine uralte Turbo Pascal-Funktion :stupid:)
Zitat:
|
AW: Lower/UpperCase beachtet Umlaute nicht
Push. Ist das Thema noch aktuell oder hat sich seit 2014 etwas getan?
|
AW: Lower/UpperCase beachtet Umlaute nicht
Mit dem TStringHelper kann man das relativ bequem lösen:
Delphi-Quellcode:
Die Funktionalität von UpperCase/LowerCase wird man wohl aus Kompatibilitätsgründen nicht ändern.
var
S: string; begin S := 'äöüÄÖÜ'; Writeln(S.ToUpper); // ÄÖÜÄÖÜ S := 'äöüÄÖÜ'; Writeln(S.ToLower); // äöüäöü S := 'äöüÄÖÜ'; Writeln(UpperCase(S)); // äöüÄÖÜ S := 'äöüÄÖÜ'; Writeln(LowerCase(S)); // äöüÄÖÜ end; |
AW: Lower/UpperCase beachtet Umlaute nicht
Dafür gibt es AnsiUpperCase und AnsiLowerCase.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:14 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-2025 by Thomas Breitkreuz