Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Ersetzen von Umlauten bei groß geschriebenen Wörtern (https://www.delphipraxis.net/183748-ersetzen-von-umlauten-bei-gross-geschriebenen-woertern.html)

Ackerjan 2. Feb 2015 10:24

Ersetzen von Umlauten bei groß geschriebenen Wörtern
 
Ich suche nach dem richtigen Ansatz für das folgende Problem. Ich habe einen Text, in dem bewusst einige Wörter in Großbuchstaben geschrieben werden. Nun müssen die Umlaute aus dem Text ersetzt werden. Dafür verwende ich die angegebene Funktion.

In Österreich wird kein SÜßHOLZ hergestellt.

Code:
function OhneUmlaute(_string: String): String;
begin
    _string := ansiReplaceStr(_string, 'ä', 'ae');
    _string := ansiReplaceStr(_string, 'ü', 'ue');
    _string := ansiReplaceStr(_string, 'ö', 'oe');
    _string := ansiReplaceStr(_string, 'Ä', 'Ae');
    _string := ansiReplaceStr(_string, 'Ü', 'Ue');
    _string := ansiReplaceStr(_string, 'Ö', 'Oe');
    _string := ansiReplaceStr(_string, 'ß', 'ss');
    Result := _string;
end;
In Oesterreich wird kein SUessHOLZ hergestellt.

Gewünscht wird allerdings der folgende Text

In Oesterreich wird kein SUESSHOLZ hergestellt.

Mein erster Ansatz wäre, den Text von vorne nach hinten durchzugehen und für Ä,Ü,Ö,ß zu prüfen ob das Zeichen davor Groß ist, dann ersetze zu AE,UE,OE,SS. Ist der Buchstabe davor nicht vorhanden oder ist es kein Buchstabe dann prüfe den Buchstaben danach und ersetzte entsprechend.

Hat da jemand einen besseren Ansatz?
Vielleicht mit regulären Ausdrücken?
Gibt es da schon was?

mkinzler 2. Feb 2015 10:28

AW: Ersetzen von Umlauten bei groß geschriebenen Wörtern
 
Unter welcher Bedingung soll das Wort kapital dargestellt werden?

Ackerjan 2. Feb 2015 10:38

AW: Ersetzen von Umlauten bei groß geschriebenen Wörtern
 
Es gibt keine Bedingung für die kapital geschrieben Wörter. Der Ausgangstext gibt die Bedingung implizit mit. So kann der Ausgangstext auch so heißen:

In ÖSTERREICH wird kein Süßholz hergestellt.

und müsste in

In OESTERREICH wird kein Sueßholz hergestellt.

umgewandelt werden.

baumina 2. Feb 2015 10:39

AW: Ersetzen von Umlauten bei groß geschriebenen Wörtern
 
Zitat:

Zitat von mkinzler (Beitrag 1288549)
Unter welcher Bedingung soll das Wort kapital dargestellt werden?

Wenn das Wort UpperCase ist, dann soll es wohl auch so bleiben.

himitsu 2. Feb 2015 10:46

AW: Ersetzen von Umlauten bei groß geschriebenen Wörtern
 
Dann muß man also das Wort vorher extrahieren und prüfen ob es kapital ist (
Delphi-Quellcode:
if Wort = AnsiUpperCase(Wort) then
)
und dann eine entsprechende Ersetzungsfunktion benutzen.

Oder ganz einfach: Wenn Großbuchstabe nicht am Wortanfang steht oder wenn er direkt oder indirekt (wegen ß, was es aktuell nicht in Groß gibt) von einem Großbuchstaben gefolgt wird, dann bleibt er groß.
Für RegEx lassen sich solche einfachen Regeln leicht mittels Look-Ahead- und Look-Behind-Befehlen (Look-Around) umsetzen.


http://www.delphipraxis.net/183730-t...ml#post1288522
http://stackoverflow.com/questions/1...ns-editpad-pro
http://www.regular-expressions.info/replacecase.html

p80286 2. Feb 2015 11:30

AW: Ersetzen von Umlauten bei groß geschriebenen Wörtern
 
Zitat:

Zitat von himitsu (Beitrag 1288552)
Oder ganz einfach: Wenn Großbuchstabe nicht am Wortanfang steht oder wenn er direkt oder indirekt (wegen ß, was es aktuell nicht in Groß gibt) von einem Großbuchstaben gefolgt wird, dann bleibt er groß.

Das ist ja nicht so ganz richtig:
http://de.wikipedia.org/wiki/Gro%C3%9Fes_%C3%9F
http://www.fileformat.info/info/unic...1e9e/index.htm

Und nochmal zur Erinnerung
ä<>ae,ü<>ue.... In Gegenden in denen noch Niederdeutsch gesprochen wird, sind z.B. Ortsnahmen oder Familiennamen mit oe gang und gäbe, und das wird dann o: oder u: gesprochen und nicht ö !

Seit wann gibt es eigentlich ASCIIextended oder ANSIextended, ganz zu schweigen von UTF-8 oder Unicode, daß immer noch diese unsäglichen ae,oe und vor allem ss-Krücken genutzt werden. Das ß ist ein eSZett und kein DoppelS. Wenn schon "daß" ersetzt werden soll, dann durch "dasz" und nicht "dass".

Gruß
K-H

Jasocul 2. Feb 2015 11:45

AW: Ersetzen von Umlauten bei groß geschriebenen Wörtern
 
Zitat:

Zitat von Ackerjan (Beitrag 1288547)
Mein erster Ansatz wäre, den Text von vorne nach hinten durchzugehen und für Ä,Ü,Ö,ß zu prüfen ob das Zeichen davor Groß ist, dann ersetze zu AE,UE,OE,SS. Ist der Buchstabe davor nicht vorhanden oder ist es kein Buchstabe dann prüfe den Buchstaben danach und ersetzte entsprechend.

Prüfe den Folgebuchstaben zuerst. Ist der groß geschrieben, dann ist auch der auszutauschende Buchstabe groß zu schreiben. Gibt es keinen Folgebuchstaben, kannst du den vorherigen Buchstaben entsprechend prüfen. Diese Prüfreihenfolge ist sicherer, da Substantive oder Wörter am Satzanfang große Anfangsbuchstaben haben.
Bei Wörtern mit zwei Buchstaben, wird die Prüfung nicht funktionieren. Aber auf Anhieb fällt mir kein Beispiel dazu ein.

himitsu 2. Feb 2015 11:48

AW: Ersetzen von Umlauten bei groß geschriebenen Wörtern
 
"aktuell nicht" :zwinker:

Vielleicht schafft das große ß es ja im nächsten Jahrtausend in die "offizielle" deutsche Sprache. :stupid:


Zitat:

SO IN UM AN

BadenPower 2. Feb 2015 11:53

AW: Ersetzen von Umlauten bei groß geschriebenen Wörtern
 
Zitat:

Zitat von Jasocul (Beitrag 1288568)
Aber auf Anhieb fällt mir kein Beispiel dazu ein.

Öl

Öl in das Feuer zu gießen, ist KEINE gute Idee.

Jasocul 2. Feb 2015 11:56

AW: Ersetzen von Umlauten bei groß geschriebenen Wörtern
 
Zitat:

Zitat von himitsu (Beitrag 1288569)
Zitat:

SO IN UM AN

Ich sehe da keine Sonderzeichen. :?
Oder habe ich das jetzt alles falsch verstanden? ;)

himitsu 2. Feb 2015 11:59

AW: Ersetzen von Umlauten bei groß geschriebenen Wörtern
 
Mist :oops:


ÄHhhhhhhhhh

Jasocul 2. Feb 2015 12:01

AW: Ersetzen von Umlauten bei groß geschriebenen Wörtern
 
Zitat:

Zitat von BadenPower (Beitrag 1288570)
Öl

"Ö" ist doch kein Problem.
Es folgt ein kleines "l", also "Oe".
"NÖ, das will ich nicht." ist ein Problem.

EDIT:
Obwohl das eigentlich auch klar ist. Selbst groß, der Buchstabe davor groß, also OE
Meiner Meinung nach geht das nur nicht mit einem zweibuchstabigen Wort, das mit "ß" endet.

p80286 2. Feb 2015 12:04

AW: Ersetzen von Umlauten bei groß geschriebenen Wörtern
 
Zitat:

Zitat von himitsu (Beitrag 1288569)

Vielleicht schafft das große ß es ja im nächsten Jahrtausend in die "offizielle" deutsche Sprache. :stupid:

Dein Wort in der Germanisten Gehörgang, allein mir fehlt der Glaube daß ich das noch erlebe.

Gruß
K-H

P.S.
Warum sollte man die Kodierung für das große SZ nicht trotzdem nutzen?

uligerhardt 2. Feb 2015 12:06

AW: Ersetzen von Umlauten bei groß geschriebenen Wörtern
 
Zitat:

Zitat von p80286 (Beitrag 1288565)
Das ß ist ein eSZett und kein DoppelS. Wenn schon "daß" ersetzt werden soll, dann durch "dasz" und nicht "dass".

EsZett? Du meinst diese Schokoladetäfelchen? Das ß ist jedenfalls ein "scharfes S", ergo "dass". :mrgreen:

baumina 2. Feb 2015 12:08

AW: Ersetzen von Umlauten bei groß geschriebenen Wörtern
 
Ich kenn nur scharfe Peperoni.

BadenPower 2. Feb 2015 12:08

AW: Ersetzen von Umlauten bei groß geschriebenen Wörtern
 
Zitat:

Zitat von Jasocul (Beitrag 1288574)
Zitat:

Zitat von BadenPower (Beitrag 1288570)
Öl

"Ö" ist doch kein Problem.
Es folgt ein kleines "l", also "Oe".
"NÖ, das will ich nicht." ist ein Problem.

Da hatte ich einen Gedankenfehler.

Es muss ja nicht entschieden werden, ob das Ö in oe oder Oe ungewandelt werden soll.

Ackerjan 2. Feb 2015 12:19

AW: Ersetzen von Umlauten bei groß geschriebenen Wörtern
 
Danke Jasocul für den Tipp. Aber auch NÖ dürfte kein Problem darstellen. Wenn es keinen Folgebuchstaben gibt und der Buchstabe davor auch noch groß ist, dann bleibt alles groß.
NÖ wird NOE
Nö wird Noe

Bei einem ß schließe ich für mich zwei Sachen aus:
1. Das die wenigen Worte mit ß und 2 Buchstaben nicht relevant sind.
Mein Kollege aß gestern eine Pizza.
2. Das niemand es schafft ein großes ß einzugeben.

Danke an himitsu für die interessanten Links.

Vielen Dank für die schnellen Antworten

p80286 2. Feb 2015 12:50

AW: Ersetzen von Umlauten bei groß geschriebenen Wörtern
 
Zitat:

Zitat von uligerhardt (Beitrag 1288578)
EsZett? Du meinst diese Schokoladetäfelchen? Das ß ist jedenfalls ein "scharfes S", ergo "dass". :mrgreen:

Na dann schau mal hier herein.

Gruß
K-H

uligerhardt 2. Feb 2015 12:59

AW: Ersetzen von Umlauten bei groß geschriebenen Wörtern
 
Zitat:

Zitat von p80286 (Beitrag 1288589)
Zitat:

Zitat von uligerhardt (Beitrag 1288578)
EsZett? Du meinst diese Schokoladetäfelchen? Das ß ist jedenfalls ein "scharfes S", ergo "dass". :mrgreen:

Na dann schau mal hier herein.

Gruß
K-H

:mrgreen:

Ackerjan 2. Feb 2015 16:30

AW: Ersetzen von Umlauten bei groß geschriebenen Wörtern
 
Meine Implementierung ohne Gewehr.

Code:
function UpperLowerReplaceString(aText, aFromText, aToUpperText, aToLowerText: String): String;

    function IsLowerCaseChar(c: Char): Boolean;
    const
        cLowerCharacters = 'abcdefghijklmnopqrstuvwxyzäöü';
    begin
        Result := (Pos(c, cLowerCharacters) > 0);
    end;

    function IsUpperCaseChar(c: Char): Boolean;
    const
        cUpperCharacters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ';
    begin
        Result := (Pos(c, cUpperCharacters) > 0);
    end;

var
    Pos: Integer;
    Upper: Boolean;
    weiter: Boolean;
begin
    Pos := 1;
    while Pos <> 0 do
    begin
        Pos := PosEx(aFromText, aText, Pos);
        weiter := True;
        Upper := False;
        if (Pos <> 0) then
        begin
            if weiter and (Pos < length(aText)) and IsLowerCaseChar(aText[Pos + 1]) then
            begin
                //kleiner Buchstabe nach dem Umlaut
                Upper := False;
                weiter := False;
            end;

            if weiter and (Pos < length(aText)) and IsUpperCaseChar(aText[Pos + 1]) then
            begin
                //großer Buchstabe nach dem Umlaut
                Upper := True;
                weiter := False;
            end;

            if weiter and (Pos > 1) and IsUpperCaseChar(aText[Pos - 1]) then
            begin
                //großer Buchstabe vor dem Umlaut / ß
                Upper := True;
                weiter := False;
            end;

            Delete(aText, Pos, 1);

            if Upper then
                Insert(aToUpperText, aText, Pos)
            else
                Insert(aToLowerText, aText, Pos);
        end;
    end;
    Result := aText;
end;

function OhneUmlaute(_string: String): String;
begin
    _string := ansiReplaceStr(_string, 'ä', 'ae');
    _string := ansiReplaceStr(_string, 'ü', 'ue');
    _string := ansiReplaceStr(_string, 'ö', 'oe');
    // Wichtig ist an dieser Stelle, dass ß zuerst ersetzt wird,
    _string := UpperLowerReplaceString(_string, 'ß', 'SS', 'ss');
    _string := UpperLowerReplaceString(_string, 'Ä', 'AE', 'Ae');
    _string := UpperLowerReplaceString(_string, 'Ü', 'UE', 'Ue');
    _string := UpperLowerReplaceString(_string, 'Ö', 'OE', 'Oe');
    Result := _string;
end;

Captnemo 3. Feb 2015 08:39

AW: Ersetzen von Umlauten bei groß geschriebenen Wörtern
 
Zitat:

Zitat von Ackerjan (Beitrag 1288584)
Danke Jasocul für den Tipp. Aber auch NÖ dürfte kein Problem darstellen. Wenn es keinen Folgebuchstaben gibt und der Buchstabe davor auch noch groß ist, dann bleibt alles groß.
NÖ wird NOE
Nö wird Noe

Also, wenn ich irgendwo in einem Text "NOE" lesen würde, käme ich nie nicht niemals auf die Idee, dass es "NÖ" bedeuten sollte. Sieht irgendwie komisch aus. Bei anderen Worten, wie KOENIG ist es nicht so.

himitsu 3. Feb 2015 09:34

AW: Ersetzen von Umlauten bei groß geschriebenen Wörtern
 
nÖ wird dann nOe :angel:

baumina 3. Feb 2015 09:38

AW: Ersetzen von Umlauten bei groß geschriebenen Wörtern
 
Noe ist ein Nachname und "ohne Gewehr" ist Frieden.


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