Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Lower/UpperCase beachtet Umlaute nicht (https://www.delphipraxis.net/183060-lower-uppercase-beachtet-umlaute-nicht.html)

Andreas L. 8. Dez 2014 15:26

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;

Bernhard Geyer 8. Dez 2014 15:29

AW: Lower/UpperCase beachtet Umlaute nicht
 
Du brauchst die AnsiUpperCaseFunktion.
Die UpperCase-Funktion berücksichtigt nur den 7-Bit Ascii-Zeichenumfang

himitsu 8. Dez 2014 15:46

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.

Redeemer 8. Dez 2014 16:16

AW: Lower/UpperCase beachtet Umlaute nicht
 
Warum so kompliziert? Und warum Ansi?
Delphi-Quellcode:
lowercase('ÄÖÜ', loUserLocale)
Funktioniert mit komplett Unicode.

himitsu 8. Dez 2014 16:32

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)

Redeemer 8. Dez 2014 16:59

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.

himitsu 8. Dez 2014 17:08

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:

Delphi-Quellcode:
(* ***** BEGIN LICENSE BLOCK *****
 *
 * The function LowerCase is licensed under the CodeGear license terms.
 *
 * The initial developer of the original code is Fastcode
 * Code was modified to to ensure the string payload is ansi
 *
 * Portions created by the initial developer are Copyright (C) 2002-2004
 * the initial developer. All Rights Reserved.
 *
 * Contributor(s): John O'Harrow, Allen Bauer
 *
 * ***** END LICENSE BLOCK ***** *)
function LowerCase(const S: string): string;
var
  I, Len: Integer;
  DstP, SrcP: PChar;
  Ch: Char;
begin
  Len := Length(S);
  SetLength(Result, Len);
  if Len > 0 then
  begin
    DstP := PChar(Pointer(Result));
    SrcP := PChar(Pointer(S));
    for I := Len downto 1 do
    begin
      Ch := SrcP^;
      case Ch of
        'A'..'Z':
          Ch := Char(Word(Ch) or $0020);
      end;
      DstP^ := Ch;
      Inc(DstP);
      Inc(SrcP);
    end;
  end;
end;

function LowerCase(const S: string; LocaleOptions: TLocaleOptions): string;
begin
  if LocaleOptions = loUserLocale then
    Result := AnsiLowerCase(S)
  else
    Result := LowerCase(S);
end;


Edelfix 14. Dez 2020 13:40

AW: Lower/UpperCase beachtet Umlaute nicht
 
Push. Ist das Thema noch aktuell oder hat sich seit 2014 etwas getan?

Uwe Raabe 14. Dez 2020 13:56

AW: Lower/UpperCase beachtet Umlaute nicht
 
Mit dem TStringHelper kann man das relativ bequem lösen:
Delphi-Quellcode:
var
  S: string;
begin
  S := 'äöüÄÖÜ';
  Writeln(S.ToUpper); // ÄÖÜÄÖÜ

  S := 'äöüÄÖÜ';
  Writeln(S.ToLower); // äöüäöü
 
  S := 'äöüÄÖÜ';
  Writeln(UpperCase(S)); // äöüÄÖÜ

  S := 'äöüÄÖÜ';
  Writeln(LowerCase(S)); // äöüÄÖÜ 
end;
Die Funktionalität von UpperCase/LowerCase wird man wohl aus Kompatibilitätsgründen nicht ändern.

Thomas Horstmann 14. Dez 2020 14:12

AW: Lower/UpperCase beachtet Umlaute nicht
 
Dafür gibt es AnsiUpperCase und AnsiLowerCase.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:21 Uhr.
Seite 1 von 2  1 2      

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