Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Umlaute in string erstetzen (https://www.delphipraxis.net/171519-umlaute-string-erstetzen.html)

khh 10. Nov 2012 12:28

Umlaute in string erstetzen
 
hallo zusammen
ich habe einen String in dem ich die Umlaute folgendermassen ersetzen möchte:
stringreplace(bezeichnung,'ä','ae',[rfReplaceAll, rfIgnoreCase]);

leider klappt das nicht, das ü wird im Debuger als #252 angezeigt.

was mache ich falsch ?

EDIT:
bezeichnung:= stringreplace(bezeichnung,'ä','ae',[rfReplaceAll, rfIgnoreCase]);

Bernhard Geyer 10. Nov 2012 12:36

AW: Umlaute in string erstetzen
 
Wie wäre es mit auswertung des Rückgabewertes?

Code:
bezeichnung := stringreplace(bezeichnung,'ä','ae',[rfReplaceAll, rfIgnoreCase]);
und ü hat den Ordinalwert #252, das ist dann auch ok.

khh 10. Nov 2012 12:38

AW: Umlaute in string erstetzen
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1190596)
Wie wäre es mit auswertung des Rückgabewertes?

Code:
bezeichnung := stringreplace(bezeichnung,'ä','ae',[rfReplaceAll, rfIgnoreCase]);
und ü hat den Ordinalwert #252, das ist dann auch ok.

hab ich natürlich gemacht, sorry wenn ich das nicht so rüber brachte.
das ä wurde aber trotzdem nicht durch ae ersetzt :-(

Popov 10. Nov 2012 12:44

AW: Umlaute in string erstetzen
 
Eigentlich sollte es klappen:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  bezeichnung: string;
begin
  bezeichnung := 'Öktöberfest in München. Da tränkt man viel Bier.';
  bezeichnung := stringreplace(bezeichnung,'ä','ae',[rfReplaceAll, rfIgnoreCase]);
  bezeichnung := stringreplace(bezeichnung,'ü','ue',[rfReplaceAll, rfIgnoreCase]);
  bezeichnung := stringreplace(bezeichnung,'ö','oe',[rfReplaceAll, rfIgnoreCase]);
  ShowMessage(bezeichnung);
end;

Bernhard Geyer 10. Nov 2012 12:47

AW: Umlaute in string erstetzen
 
Ich lese gerade Freepascal!
Kann es sein das hier diese Funktion einen fehler hat?
In Freepascal/Lazarus ist man ja auf die Glorreiche Idee gekommen im Gegensatz zu allen anderen relevanten modernen Programmiersprachen/Frameworks wie .NET/Java/Delphi (:-) Unicode rein per UTF8 zu realiseren und keinen Wide/Unicodestring einzuführen/durchzuziehen. Da gab schon öfter einige Funktionen die das dann nicht berücksichtigt hatten. Evtl erwartet ja diese Funktion unter FP/lazarus einen UTF8-String statt eines ANSI-Strings.

khh 10. Nov 2012 12:48

AW: Umlaute in string erstetzen
 
ja mit deinem Oktoberfest klappt es auch :-(

Mein Wert kommt aber aus der DB und da klappt es leider nicht,

bezeichnung:= orteZTable.FieldByName('bezeichnung').asstring;

das DB feld ist folgendermassen definiert :
BEZEICHNUNG CHAR(100) CHARACTER SET ISO8859_1 COLLATE DE_DE,

khh 10. Nov 2012 12:49

AW: Umlaute in string erstetzen
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1190600)
Ich lese gerade Freepascal!
Kann es sein das hier diese Funktion einen fehler hat?
In Freepascal/Lazarus ist man ja auf die Glorreiche Idee gekommen im Gegensatz zu allen anderen relevanten modernen Programmiersprachen/Frameworks wie .NET/Java/Delphi (:-) Unicode rein per UTF8 zu realiseren und keinen Wide/Unicodestring einzuführen/durchzuziehen. Da gab schon öfter einige Funktionen die das dann nicht berücksichtigt hatten. Evtl erwartet ja diese Funktion unter FP/lazarus einen UTF8-String statt eines ANSI-Strings.

Heißt ich muss erst nach UTF8 umwandeln?

EDIT: super, so funktionierts :-)

Ich danke euch

Bernhard Geyer 10. Nov 2012 13:02

AW: Umlaute in string erstetzen
 
Zitat:

Zitat von khh (Beitrag 1190602)
Heißt ich muss erst nach UTF8 umwandeln?

EDIT: super, so funktionierts :-)

Bei FP/Lazaraus musst du eigentlich immer zuerst mal schauen obs mit einem UTF8 oder mit einem ANSI-String klappt. So wie es ausschaut gibt dort eine munteren Mix aus String-Codierung der benötigt wird.

khh 10. Nov 2012 13:08

AW: Umlaute in string erstetzen
 
Ich danke euch

Popov 10. Nov 2012 14:22

AW: Umlaute in string erstetzen
 
Ansonsten hätte ich dir eine meiner Funktionen empfohlen. Die habe ich damals bei Delphi 3 geschrieben, die hatte kein StringReplace. Die Funktion ist zwar für Strings, aber ich schätze die kann man für seine Bedürfnisse anpassen:

Delphi-Quellcode:
type
  TReplaceFlags = set of (rfReplaceAll, rfIgnoreCase); //Wichtig!!! Global setzen


function StringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string;

  function PosEx(Substr: string; S: string; Flag: TReplaceFlags): Integer;
  begin
    if rfIgnoreCase in Flag
    then Result := Pos(AnsiUpperCase(Substr), AnsiUpperCase(S))
    else Result := Pos(Substr, S);
  end;

var
  S2: String;
begin
  S2 := S;
  Result := '';
  while Length(S2) > 0 do begin
    if PosEx(OldPattern, S2, Flags) > 0 then begin
      Result := Result + Copy(S2, 1, PosEx(OldPattern, S2, Flags) - 1);
      Delete(S2, 1, PosEx(OldPattern, S2, Flags) + Length(OldPattern) - 1);
      Result := Result + NewPattern;
    end else begin
      Result := Result + S2;
      Delete(S2, 1, Length(S2));
    end;
    if not (rfReplaceAll in Flags) then begin
      Result := Result + S2;
      Delete(S2, 1, Length(S2));
    end;
  end;
end; {Popov}


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