Delphi-PRAXiS

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}

Furtbichler 10. Nov 2012 15:22

AW: Umlaute in string erstetzen
 
und das funktioniert auch, wenn der String utf-8 kodiert ist?

Popov 10. Nov 2012 15:26

AW: Umlaute in string erstetzen
 
Keine Ahnung, wahrscheinlich nicht, habe ich auch für Delphi 3 geschrieben. Ist auch nur selber etwas machen.

himitsu 10. Nov 2012 15:28

AW: Umlaute in string erstetzen
 
Das wird ihm nicht viel helfen, da das ANSI-UTF8-Problem weiterhin besteht.

Manchmal ist es zwar nervig, daß Delphi automatisch die Stringtypen konvertiert und da "versucht" automatisch die "richtige/passende" Konvertierung zu wählen, aber meistens ist es doch recht praktisch, daß hier Compiler und RTL/VCL zusammengehören.

Bei Lazarus ist halt das Problem, daß FPC und Lazarus nicht wirklich zusammengehören.
Der Compiler (FreePascal) und seine Typen sind weiterhin ANSI (bei Delphi hatte man sich dazu entschieden das auf Unicode umzustellen, genauer auf UCS2/UTF-16, was allerdings andere Probleme verursachte),
wärend Lazarus (RTL/VCL) an den meisten Stellen auf UTF-8 (damit es in 'nen AnsiString paßt) umgestellt wurde.

Nur gibt es da eben hier und da einige Probleme, wenn man vergißt die String-Kodierung anzupassen, bzw. wenn unterschiedliche Kodierungen aufeinandertreffen.
Man kann eben kein ANSI "ä" in einem UTF-8-String finden, oder umgekehrt.

khh 10. Nov 2012 18:15

AW: Umlaute in string erstetzen
 
ich danke euch allen


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