AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Lower/UpperCase beachtet Umlaute nicht

Ein Thema von Andreas L. · begonnen am 8. Dez 2014 · letzter Beitrag vom 14. Dez 2020
Antwort Antwort
Seite 1 von 2  1 2      
Andreas L.

Registriert seit: 23. Mai 2011
Ort: Furth im Wald
308 Beiträge
 
Delphi 11 Alexandria
 
#1

Lower/UpperCase beachtet Umlaute nicht

  Alt 8. Dez 2014, 16:26
Delphi-Version: 2009
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;
Andreas Lauß
Blog
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Lower/UpperCase beachtet Umlaute nicht

  Alt 8. Dez 2014, 16:29
Du brauchst die AnsiUpperCaseFunktion.
Die UpperCase-Funktion berücksichtigt nur den 7-Bit Ascii-Zeichenumfang
Windows Vista - Eine neue Erfahrung in Fehlern.

Geändert von Bernhard Geyer ( 8. Dez 2014 um 17:14 Uhr) Grund: Link korrigiert
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Lower/UpperCase beachtet Umlaute nicht

  Alt 8. Dez 2014, 16:46
@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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.051 Beiträge
 
Delphi 2009 Professional
 
#4

AW: Lower/UpperCase beachtet Umlaute nicht

  Alt 8. Dez 2014, 17:16
Warum so kompliziert? Und warum Ansi?lowercase('ÄÖÜ', loUserLocale) Funktioniert mit komplett Unicode.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Lower/UpperCase beachtet Umlaute nicht

  Alt 8. Dez 2014, 17:32
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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 8. Dez 2014 um 17:35 Uhr)
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.051 Beiträge
 
Delphi 2009 Professional
 
#6

AW: Lower/UpperCase beachtet Umlaute nicht

  Alt 8. Dez 2014, 17:59
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.
Janni
2005 PE, 2009 PA, XE2 PA

Geändert von Redeemer ( 8. Dez 2014 um 18:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Lower/UpperCase beachtet Umlaute nicht

  Alt 8. Dez 2014, 18:08
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 )

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;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Edelfix

Registriert seit: 6. Feb 2015
Ort: Stadtoldendorf
214 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Lower/UpperCase beachtet Umlaute nicht

  Alt 14. Dez 2020, 14:40
Push. Ist das Thema noch aktuell oder hat sich seit 2014 etwas getan?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#9

AW: Lower/UpperCase beachtet Umlaute nicht

  Alt 14. Dez 2020, 14:56
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Thomas Horstmann

Registriert seit: 25. Apr 2007
Ort: NRW
87 Beiträge
 
Delphi 12 Athens
 
#10

AW: Lower/UpperCase beachtet Umlaute nicht

  Alt 14. Dez 2020, 15:12
Dafür gibt es AnsiUpperCase und AnsiLowerCase.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 10:56 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