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/)
-   -   Delphi Zeichenkette durch Umlaut ersetzen (https://www.delphipraxis.net/197388-zeichenkette-durch-umlaut-ersetzen.html)

AWilhelm 3. Aug 2018 09:43

Zeichenkette durch Umlaut ersetzen
 
Hallo zusammen,

ich möchte einen Text aus einer INI-Datei auslesen und diesen in ein TEdit-Feld schreiben. Zusätzlich soll vorher in dem Text die Zeichenfolge "\u00e4" durch ein "ä" ersetzt werden. In dem Textfeld wird dann aber statt des "ä" ein "?" angezeigt.


Delphi-Quellcode:
//------------------------------------------------------------------------------------------------------------------------------------------------------------
function GetIniStr( iniFilename, iniSect, IniEntry, iniDefault : string ) : string;
//------------------------------------------------------------------------------------------------------------------------------------------------------------
var inifile        : TMemIniFile;
begin
   result := inidefault;
   inifile := TMemIniFile.create( iniFilename );
   try
      result := inifile.ReadString( iniSect, IniEntry, iniDefault );
      result := StringReplace(result, '\u00e4', 'ä', [rfReplaceAll]);
   finally
      inifile.Free;
   end;
end;

txtSuchdatum.Text := GetIniStr('config.ini', 'Testsection', 'TestEntry', '');

Uwe Raabe 3. Aug 2018 09:48

AW: Zeichenkette durch Umlaut ersetzen
 
Welche Delphi-Version?

Kannst du ein minimales Beispielprogramm lieder, das dieses Verhalten zeigt?

himitsu 3. Aug 2018 12:10

AW: Zeichenkette durch Umlaut ersetzen
 
Beispielprogramm: Das wäre dann vermutlich ANSI und nicht auf einem deutschen Windows kompiliert.
Also grundsätzlich funktioniert dieser Code, außer der Stringinhalt wird irgendwo durch eine Codepage gejagt, welche keine deutschen Umlaute kennt.



Abgesehn von dem grundsätzlichen Problem, welches erstmal gelöst werden muß.

Was passiert, wenn du auch ein ü bauchst und dann das ö, Ö, &, á oder 湜?
Ich hätte gedacht, dass z.B. in den Indy irgenwo eine Decodier-Funktion für sowas versteckt wäre, die man hätte nutzten können (fand auf die Schnelle nichts),
aber notfalls ginge auch sowas
Delphi-Quellcode:
Result := TRegEx.Replace(Result, '\\u[0-9a-f]{4}', MyReplace);

function TXxxx.MyReplace(const Match: TMatch): string;
begin
  Result := Char(StrToInt('$' + Copy(Match.Value, 3)));
end;
Delphi-Referenz durchsuchenRegularExpressions

HolgerX 3. Aug 2018 13:02

AW: Zeichenkette durch Umlaut ersetzen
 
Hmm..

Bei dieser Zeichenfolge ('\u00e4') scheint es sich um escaped JSON-String zu handeln.

Schau mal hier:
https://stackoverflow.com/questions/...8-escaped-text

dort gibt es ein Unescape, welches dein Problem lösen sollte.

Statt

result := StringReplace(result, '\u00e4', 'ä', [rfReplaceAll]);

dann einfach

result := Unescape(result);

Es würden dann auch gleich alle anderen Zeichen ('üöä') berücksichtigt..

KodeZwerg 3. Aug 2018 17:32

AW: Zeichenkette durch Umlaut ersetzen
 
Zitat:

Zitat von AWilhelm (Beitrag 1409597)
Delphi-Quellcode:
result := StringReplace(result, '\u00e4', 'ä', [rfReplaceAll]);

Ist das echt legitim, einen String mit sich selbst ändern zu wollen? Hab es noch nicht getestet aber ich würde es eher so machen:
Delphi-Quellcode:
function GetIniStr( iniFilename, iniSect, IniEntry, iniDefault : string ) : string;
var inifile        : TMemIniFile;
    s: String;
begin
   s := inidefault;
   inifile := TMemIniFile.create( iniFilename );
   try
      s := inifile.ReadString( iniSect, IniEntry, iniDefault );
      result := StringReplace(s, '\u00e4', 'ä', [rfReplaceAll]);
   finally
      inifile.Free;
   end;
end;

hoika 3. Aug 2018 18:19

AW: Zeichenkette durch Umlaut ersetzen
 
Hallo,
Zitat:

Ist das echt legitim
Warum soll das nicht gehen?

Delphi-Quellcode:
s= '';
s:= s+'a'+'b';
Aber ja, ich würde auch eine lokale Variable benutzen, schon wegen der besseren Übersicht und Debugbarkeit.

DieDolly 3. Aug 2018 19:17

AW: Zeichenkette durch Umlaut ersetzen
 
Zitat:

Zitat von KodeZwerg (Beitrag 1409677)
Zitat:

Zitat von AWilhelm (Beitrag 1409597)
Delphi-Quellcode:
result := StringReplace(result, '\u00e4', 'ä', [rfReplaceAll]);

Ist das echt legitim, einen String mit sich selbst ändern zu wollen?

Wo man mit der CE-Version endlich die Quellcodes ansehen kann, sieht man, dass StringReplace intern Source in eine Zwischenvariable speichert.
Also alles legitim.

KodeZwerg 3. Aug 2018 19:22

AW: Zeichenkette durch Umlaut ersetzen
 
Zitat:

Zitat von DieDolly (Beitrag 1409690)
Zitat:

Zitat von KodeZwerg (Beitrag 1409677)
Zitat:

Zitat von AWilhelm (Beitrag 1409597)
Delphi-Quellcode:
result := StringReplace(result, '\u00e4', 'ä', [rfReplaceAll]);

Ist das echt legitim, einen String mit sich selbst ändern zu wollen?

Also alles legitim.

Ja genau daran hatte es gerade gehappert, kein Delphi zur Hand, für
Delphi-Quellcode:
s := s+'1'+s+'2'
usw war es mir schon klar, aber halt beim StringManipulator() nicht. Danke DieDolly!

himitsu 3. Aug 2018 20:29

AW: Zeichenkette durch Umlaut ersetzen
 
Zitat:

Zitat von KodeZwerg (Beitrag 1409677)
Ist das echt legitim, einen String mit sich selbst ändern zu wollen?

Warum nicht?

Delphi-Strings sind referenzgezählt
und bei Änderung greift ein automatisches CopyOnWrite.

Also die "Kopie" in dem Parameter behält die Referenz und für das Result wird ein neuer String erstellt und da dann reingegeben.

PS: Auch
Delphi-Quellcode:
s := s + '1' + s + '2';
ist eigentlich ein Funktionsaufruf, für den sich in der System-Unit ein paar Funktionen verstecken. (mit bissl CompilerMagic für Funktionen mit einer unbestimmten Anzahl an Parametern, welche man leider nicht für eigene Funktionen verwenden darf :cry:)
Delphi-Quellcode:
s := Concat(s, '1', s, '2');

KodeZwerg 3. Aug 2018 20:43

AW: Zeichenkette durch Umlaut ersetzen
 
offtopic
Zitat:

Zitat von himitsu (Beitrag 1409700)
Delphi-Quellcode:
s := Concat(s, '1', s, '2');

Naja, es gibt auch Funktionen deren Sinnhaftigkeit mir bisweilen nicht ersichtlich wird.
Ein Plus Kommando ist schneller und hat nicht solche Restriktionen wobei wenn überhaupt eh das selbe hinten rauskommt :?:


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