Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Umlaute in String ersetzen (https://www.delphipraxis.net/76809-umlaute-string-ersetzen.html)

Andreas L. 10. Sep 2006 12:31


Umlaute in String ersetzen
 
Hi,
gibt es schon eine Funktion die mir Umlaute wie ß, ö, ü, ä, usw. in einen String mit ss, oe, ue, ae ersetzt? Hintergrund: Ich lese Bezeichnungen und Namen aus einer Datei und weiß diese Werte dynamisch generierten Komponenten zu. Solche Zeichen sind aber nicht als Komponentenname erlaubt.

Kennt jemand so eine Funktion? Ansonsten muss ich mir die wohl selber bauen.

Namenloser 10. Sep 2006 12:32

Re: Umlaute in String ersetzen
 
stringreplace ist das stichwort. Dazu musst du aber die unit "strutils" einbinden.

Andreas L. 10. Sep 2006 12:34

Re: Umlaute in String ersetzen
 
Zitat:

Zitat von NamenLozer
stringreplace ist das stichwort. Dazu musst du aber die unit "strutils" einbinden.

StringReplace ist mir bekannt. Das muss ich dann aber für jedes Umlaut einzeln ausführen. Außerdem ist es sehr langsam. Da muss es doch schon was Delphi-Internes geben...

Namenloser 10. Sep 2006 12:39

Re: Umlaute in String ersetzen
 
Dann fällt mir eigentlich nur noch sowas ein:

Delphi-Quellcode:
function ErsetzeUmlaute(s: string): string;
var i: integer;
begin
  for i := 1 to length(s) do
  begin
    Case s[i] of
    'ä': result := result+'ae';
    'ü': result := result+'ue';
    'ö': result := result+'oe';
    'ß': result := resultü'ss';
    else: result := resultüs[i];
    end;
  end;
end;
Oder gibt es was eleganteres?

Christian Seehase 10. Sep 2006 13:10

Re: Umlaute in String ersetzen
 
Moin Andreas,

ist auch sichergestellt, dass es sich nur um diese Sonderzeichen handeln kann, und nicht etwa auch é usw. dort auftauchen können?

Andreas L. 10. Sep 2006 13:16

Re: Umlaute in String ersetzen
 
Zitat:

Zitat von Christian Seehase
Moin Andreas,

ist auch sichergestellt, dass es sich nur um diese Sonderzeichen handeln kann, und nicht etwa auch é usw. dort auftauchen können?

Da der User diese Werte selber in Dateien eintragen kann könnte dies natürlich auch passieren.

marabu 10. Sep 2006 13:46

Re: Umlaute in String ersetzen
 
Hallo Andreas,

vielleicht findest du in folgendem thread noch ein paar Denkanstöße: StringReplace einmal auslösen für alle Umlaute?

Grüße vom marabu

Jürgen Thomas 10. Sep 2006 15:48

Re: Umlaute in String ersetzen
 
Hallo,

in meiner Frage [dp]StringReplace automatisch - was geht schnell und einfach?[/dp] wurde Folgendes empfohlen:
  • in (konstanten oder variablen) Arrays arrSearch und arrReplace alle gewünschten Konvertierungen vorsehen
  • Datei als String einlesen (für FileStream ist die Dateigröße bekannt)
  • in einer Schleife für jedes Element von arrSearch/arrReplace mit StringReplace bearbeiten
  • dann den String wieder als Textdatei speichern
Gruß Jürgen

[/edit]Nachtrag (@Manuel 3_of_8 in #9)
Meine Frage war allgemeiner formuliert worden, und dort werden bei der Suche Strings (nicht Chars) verwendet. Bei der Suche nach Chars kann man es natürlich mit einer Schleife erledigen.

3_of_8 10. Sep 2006 16:00

Re: Umlaute in String ersetzen
 
Das dürfte recht langsam sein, da die Schleife immer wieder für jeden Umlaut durchlaufen wird und nicht einmal für alle zusammen.

Namenloser 12. Sep 2006 21:00

Re: Umlaute in String ersetzen
 
Delphi-Quellcode:
function ErsetzeUmlaute(s: string): string;
var i,j: integer;
const
      AnzUmlaute =7;
      Umlaute: Array[0..AnzUmlaue-1] of char = ('ä','ö','ü','ß','Ä','Ö','Ü');
      Ersetzt: Array[0..AnzUmlaue-1] of string = ('ae','oe','ue','ss','Ae','Ue','Oe');
begin
  for i := 1 to length(s) do
  begin
    for j := 0 to anzumlaute-1 do
    begin
      if s[i] = Umlaute[j] then
      begin
        result := result+umlaute[j];
        break;
      end
      else
        result := result+s[i];
    end;
  end;
end;
Ich habs mal etwas erweitert. Ich denke aber, dass es nicht besonders schnell ist wegen "result:=result+...".

Hawkeye219 12. Sep 2006 22:18

Re: Umlaute in String ersetzen
 
Hallo NamenLozer,

abgesehen von dem fehlenden Buchstaben ("AnzUmlaue") und der Vertauschung ("Ue" <-> ""Oe") enthält dein Algorithmus noch einen logischen Fehler: Buchstaben, die nicht im Array Umlaute enthalten sind, werden 7 mal in den Ergebnisstring gepackt.

Gruß Hawkeye

SirThornberry 12. Sep 2006 23:05

Re: Umlaute in String ersetzen
 
Es ist recht unperfoment einen String immer wieder zu verlängern in dem man was anhängt. Sinvoller ist es den String anfangs auf die maximale Länge zu setzen (also doppelt so lang wie den originalen in diesem fall) und am ende den String mit SetLength wieder zu kürzen.

ehoffman 13. Sep 2006 00:54

Re: Umlaute in String ersetzen
 
Hallo,

in erster Linie würde ich mich fragen in welcher Sprache wird der Benutzer die Texte eingeben. Daraus ließe sich dann ableiten welche Sonderzeichen (= Zeichen oberhalb von US-ASCII) zu erwarten sind. Dementsprechend wird dann eine umkodierung des Zeichensatzes in den von dir verwendeten Zeichensatz vorgenommen (hier tatsächlich US-ASCII -- was für den recoder bedeutet alle Umlaute/"Sonderzeichen" durch die entsprechenden phonetischen Äquivalente zu ersetzen). Klingt kompliziert - ist es auch, funktioniert aber. Ideal wäre das Ganze nach UTF8 zu kodieren, aber damit steht selbst Windows XP noch ein wenig auf Kriegsfuss... Insofern bleibt alles was nicht "erwartet" wird (= zu erwartende Standardsprache des/der Anwender/s) als Sonderfall aussen vor.

Ich empfehle: http://www.gnu.org/software/recode/recode.html

In dem Quellcode findet man alles was zu diesem Thema programmiert werden könnte (Sprache C), allerdings nur für OpenSource Projekte...

mfg
Eike


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:59 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