Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Umlaute und Sonderzeichen "lesbar" ersetzen (https://www.delphipraxis.net/191947-umlaute-und-sonderzeichen-lesbar-ersetzen.html)

uligerhardt 6. Mär 2017 13:43

Umlaute und Sonderzeichen "lesbar" ersetzen
 
Hallo zusammen!

Ein Kollege will gerade aus Strings, die auch Umlaute, ß, Akzente und sonstige Sonderzeichen enthalten, Delphi-Bezeichner (A-Za-z0-9_) machen.
Sie sollen dabei aber möglichst lesbar bleiben, also z.B. ä=>ae, ß=>ss, ó=>o. Gibt's dafür Delphi- oder Windows-Funktionalität?
Unsere bisherige Lösung ist eine StringReplace-Orgie, das muss doch besser gehen. :mrgreen:

t.roller 6. Mär 2017 13:53

AW: Umlaute und Sonderzeichen "lesbar" ersetzen
 
Eine Orgie sind diese 7 Zeilen nicht:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Text:= StringReplace(Memo1.Text, 'ä', 'ae',[rfReplaceAll]);
Memo1.Text:= StringReplace(Memo1.Text, 'ö', 'oe',[rfReplaceAll]);
Memo1.Text:= StringReplace(Memo1.Text, 'ü', 'ue',[rfReplaceAll]);
Memo1.Text:= StringReplace(Memo1.Text, 'Ä', 'Ae',[rfReplaceAll]);
Memo1.Text:= StringReplace(Memo1.Text, 'Ö', 'Oe',[rfReplaceAll]);
Memo1.Text:= StringReplace(Memo1.Text, 'Ü', 'Ue',[rfReplaceAll]);
Memo1.Text:= StringReplace(Memo1.Text, 'ß', 'ss',[rfReplaceAll]);
end;

uligerhardt 6. Mär 2017 13:57

AW: Umlaute und Sonderzeichen "lesbar" ersetzen
 
Zitat:

Zitat von t.roller (Beitrag 1363331)

Danke, aber die explizite Auflistung aller (oder - im verlinkten Beispiel - eben nicht aller (ó, È, ...)) Kandidaten ist ja genau das, was ich vermeiden will.

t.roller 6. Mär 2017 14:28

AW: Umlaute und Sonderzeichen "lesbar" ersetzen
 
Das verlinkte Beispiel funktionierte leider nicht - deshalb entfernt.
Microsoft hat sich noch nie RICHTIG um andere Sprachen gekümmert, deshalb haben wir nach 35 Jahren immer noch Chaos(Char, ANSIChar, WIDEChar u.a.)

Es gibt viele Sprachen mit Diacritics, sogar English enthält Diacritics.

himitsu 6. Mär 2017 14:35

AW: Umlaute und Sonderzeichen "lesbar" ersetzen
 
Du kannst WideCharToMultoByte verwenden und nach ASCII konvertieren, wobei z.B. aus ó auch o werden.

uligerhardt 6. Mär 2017 14:36

AW: Umlaute und Sonderzeichen "lesbar" ersetzen
 
Zitat:

Zitat von t.roller (Beitrag 1363331)
Eine Orgie sind diese 7 Zeilen nicht:

Ja. Aber es gibt ja eine Menge anderer Zeichen, die behandelt werden müssen, z.B. ó, È und was weiß ich noch.
Mir ist aber in der Zwischenzeit aufgegangen, dass das Ganze wohl sprachabhängig sein wird - z.B. wird aus ä vermutlich nur in Deutsch ae, während andere Sprachen einfach a draus machen. Damit wird's dann langsam unangenehm. :-/

nahpets 6. Mär 2017 15:18

AW: Umlaute und Sonderzeichen "lesbar" ersetzen
 
Du suchst sowas:
Delphi-Quellcode:
function ZeichenErsetzen(sIn : String) : String;
var
  i : Integer;
begin
  Result := '';
  for i := 1 to Length(sIn) do begin
    Case sIn[i] Of
       #0  .. #47 : Result := Result + '_';    // Alles vor den Ziffern
       #48 .. #57 : Result := Result + sIn[i]; // die Ziffern
       #58 .. #64 : Result := Result + '_';    // Alles zwischen den Ziffern und den Großbuchstaben
       #65 .. #90 : Result := Result + sIn[i]; // die Großbuchstaben
       #91 .. #96 : Result := Result + '_';    // Alles zwischen den Großbuchstaben und den Kleinbuchstaben
       #97 ..#122 : Result := Result + sIn[i]; // die Kleinbuchstaben
      // Tja und dann:
      // zeichenweise oder doch lieber weitere Gruppen bilden?
      // Hier ginge auch noch
      // #123 .. #137 : Result := Result + '_';
      #123        : Result := Result + '_'; // {
      #124        : Result := Result + '_'; // |
      #125        : Result := Result + '_'; // }
      #126        : Result := Result + '_'; // ~
      #127        : Result := Result + '_'; // 
      #128        : Result := Result + '_'; // €
      #129        : Result := Result + '_'; // 
      #130        : Result := Result + '_'; // ‚
      #131        : Result := Result + '_'; // ƒ
      #132        : Result := Result + '_'; // „
      #133        : Result := Result + '_'; // …
      #134        : Result := Result + '_'; // †
      #135        : Result := Result + '_'; // ‡
      #136        : Result := Result + '_'; // ˆ
      #137        : Result := Result + '_'; // ‰
      #138        : Result := Result + 'S'; // Š
      #139        : Result := Result + '_'; // ‹
      #140        : Result := Result + 'OE'; // Œ
      #141        : Result := Result + '_'; // 
      #142        : Result := Result + 'Z'; // Ž
      #143        : Result := Result + '_'; // 
      #144        : Result := Result + '_'; // 
      #145        : Result := Result + '_'; // ‘
      #146        : Result := Result + '_'; // ’
      #147        : Result := Result + '_'; // “
      #148        : Result := Result + '_'; // ”
      #149        : Result := Result + '_'; // •
      #150        : Result := Result + '_'; // –
      #151        : Result := Result + '_'; // —
      #152        : Result := Result + '_'; // ˜
      #153        : Result := Result + 'TM'; // ™
      #154        : Result := Result + 's'; // š
      #155        : Result := Result + '_'; // ›
      #156        : Result := Result + 'oe'; // œ
      #157        : Result := Result + '_'; // 
      #158        : Result := Result + 'z'; // ž
      #159        : Result := Result + 'Y'; // Ÿ
      #160        : Result := Result + '_'; // *
      #161        : Result := Result + '_'; // ¡
      #162        : Result := Result + '_'; // ¢
      #163        : Result := Result + '_'; // £
      #164        : Result := Result + '_'; // ¤
      #165        : Result := Result + '_'; // ¥
      #166        : Result := Result + '_'; // ¦
      #167        : Result := Result + '_'; // §
      #168        : Result := Result + '_'; // ¨
      #169        : Result := Result + '_'; // ©
      #170        : Result := Result + '_'; // ª
      #171        : Result := Result + '_'; // «
      #172        : Result := Result + '_'; // ¬
      #173        : Result := Result + '_'; // *
      #174        : Result := Result + '_'; // ®
      #175        : Result := Result + '_'; // ¯
      #176        : Result := Result + '_'; // °
      #177        : Result := Result + '_'; // ±
      #178        : Result := Result + '_'; // ²
      #179        : Result := Result + '_'; // ³
      #180        : Result := Result + '_'; // ´
      #181        : Result := Result + '_'; // µ
      #182        : Result := Result + '_'; // ¶
      #183        : Result := Result + '_'; // ·
      #184        : Result := Result + '_'; // ¸
      #185        : Result := Result + '1'; // ¹
      #186        : Result := Result + '_'; // º
      #187        : Result := Result + '_'; // »
      #188        : Result := Result + '1_4'; // ¼
      #189        : Result := Result + '1_2'; // ½
      #190        : Result := Result + '3_4'; // ¾
      #191        : Result := Result + '_'; // ¿
      #192        : Result := Result + 'A'; // À
      #193        : Result := Result + 'A'; // Á
      #194        : Result := Result + 'A'; // Â
      #195        : Result := Result + 'A'; // Ã
      #196        : Result := Result + 'Ae'; // Ä
      #197        : Result := Result + 'A'; // Å
      #198        : Result := Result + 'AE'; // Æ
      #199        : Result := Result + 'C'; // Ç
      #200        : Result := Result + 'E'; // È
      #201        : Result := Result + 'E'; // É
      #202        : Result := Result + 'E'; // Ê
      #203        : Result := Result + 'Ee'; // Ë
      #204        : Result := Result + 'I'; // Ì
      #205        : Result := Result + 'I'; // Í
      #206        : Result := Result + 'I'; // Î
      #207        : Result := Result + 'Ie'; // Ï
      #208        : Result := Result + 'D'; // Ð
      #209        : Result := Result + 'N'; // Ñ
      #210        : Result := Result + 'O'; // Ò
      #211        : Result := Result + 'O'; // Ó
      #212        : Result := Result + 'O'; // Ô
      #213        : Result := Result + 'O'; // Õ
      #214        : Result := Result + 'Oe'; // Ö
      #215        : Result := Result + 'x'; // ×
      #216        : Result := Result + 'O'; // Ø
      #217        : Result := Result + 'U'; // Ù
      #218        : Result := Result + 'U'; // Ú
      #219        : Result := Result + 'U'; // Û
      #220        : Result := Result + 'Ue'; // Ü
      #221        : Result := Result + 'Y'; // Ý
      #222        : Result := Result + '_'; // Þ
      #223        : Result := Result + 'ss'; // ß
      #224        : Result := Result + 'a'; // à
      #225        : Result := Result + 'a'; // á
      #226        : Result := Result + 'a'; // â
      #227        : Result := Result + 'a'; // ã
      #228        : Result := Result + 'ae'; // ä
      #229        : Result := Result + 'a'; // å
      #230        : Result := Result + 'ae'; // æ
      #231        : Result := Result + 'c'; // ç
      #232        : Result := Result + 'e'; // è
      #233        : Result := Result + 'e'; // é
      #234        : Result := Result + 'E'; // ê
      #235        : Result := Result + 'ee'; // ë
      #236        : Result := Result + 'i'; // ì
      #237        : Result := Result + 'i'; // í
      #238        : Result := Result + 'i'; // î
      #239        : Result := Result + 'ie'; // ï
      #240        : Result := Result + '_'; // ð
      #241        : Result := Result + 'n'; // ñ
      #242        : Result := Result + 'o'; // ò
      #243        : Result := Result + 'o'; // ó
      #244        : Result := Result + 'o'; // ô
      #245        : Result := Result + 'o'; // õ
      #246        : Result := Result + 'oe'; // ö
      #247        : Result := Result + '_'; // ÷
      #248        : Result := Result + 'o'; // ø
      #249        : Result := Result + 'u'; // ù
      #250        : Result := Result + 'u'; // ú
      #251        : Result := Result + 'u'; // û
      #252        : Result := Result + 'ue'; // ü
      #253        : Result := Result + 'y'; // ý
      #254        : Result := Result + '_'; // þ
      #255        : Result := Result + 'ye'; // ÿ
    end;
  end;
  while Pos('__',Result) > 0 do Result := AnsiReplaceText(Result,'__','_');
end;
lediglich auf alle Sprachen erweitert ;-)

Zitat:

Zitat von uligerhardt (Beitrag 1363338)
Zitat:

Zitat von t.roller (Beitrag 1363331)
Eine Orgie sind diese 7 Zeilen nicht:

Ja. Aber es gibt ja eine Menge anderer Zeichen, die behandelt werden müssen, z.B. ó, È und was weiß ich noch.
Mir ist aber in der Zwischenzeit aufgegangen, dass das Ganze wohl sprachabhängig sein wird - z.B. wird aus ä vermutlich nur in Deutsch ae, während andere Sprachen einfach a draus machen. Damit wird's dann langsam unangenehm. :-/

Der letzte Satz in diesem Zitat ist (vermutlich) die Ursache dafür, dass es das Gesuchte nicht gibt. Es kann annähernd beliebig komplex werden.

Ohne eine klare Vorgabe zu der / den unterstützten Sprache(n) und klaren "Übersetzungsanweisungen" wird das nix.

Sherlock 6. Mär 2017 15:21

AW: Umlaute und Sonderzeichen "lesbar" ersetzen
 
Die Frage auch hier muss sein: Wozu? Ich stand zB auch mal vor dem Problem, daß ich Dateinamen mit Hilfe von Personennamen erzeugt hatte. In dem einen oder anderen Filesystem führte das zu, nennen wir es mal Problemen. Ich hatte dann angefangen mühselig Umlaute in ihre Pendants zu übersetzen, aber dachte mir auf der Hälfte des Wegs: Ich bin doch nicht blöd, und habe die Umlaute schlicht rausgestrichen. Liest ja eh keiner, denn die Dateien werden per DB gefunden/verwaltet.
Wenn das also schlußendlich niemand oder nur ein sehr eingeschränkter Personenkreis zu sehen bekommt, dann gilt KISS und die Sache gehört anders gelöst.

Sherlock

nahpets 6. Mär 2017 15:39

AW: Umlaute und Sonderzeichen "lesbar" ersetzen
 
Zitat:

Zitat von Sherlock (Beitrag 1363341)
Die Frage auch hier muss sein: Wozu? Ich stand zB auch mal vor dem Problem, daß ich Dateinamen mit Hilfe von Personennamen erzeugt hatte. In dem einen oder anderen Filesystem führte das zu, nennen wir es mal Problemen. Ich hatte dann angefangen mühselig Umlaute in ihre Pendants zu übersetzen, aber dachte mir auf der Hälfte des Wegs: Ich bin doch nicht blöd, und habe die Umlaute schlicht rausgestrichen. Liest ja eh keiner, denn die Dateien werden per DB gefunden/verwaltet.
Wenn das also schlußendlich niemand oder nur ein sehr eingeschränkter Personenkreis zu sehen bekommt, dann gilt KISS und die Sache gehört anders gelöst.

Sherlock

Übersetzt auf meine obige Routine hieße das schlicht:
Delphi-Quellcode:
function ZeichenErsetzen(sIn : String) : String;
var
  i : Integer;
begin
  Result := '';
  for i := 1 to Length(sIn) do begin
    Case sIn[i] Of
       #48 .. #57, #65 .. #90, #97 .. #122: Result := Result + sIn[i];
    else
      Result := Result + '_';
    end;
  end;
  while Pos('__',Result) > 0 do Result := AnsiReplaceText(Result,'__','_');
end;
Auch wenn hier letztlich Zeichen verschluckt werden, es bleibt für's Gehirn lesbar und das dürfte wesentlich sein, sofern denn Lesbarkeit überhaupt erforderlich sein sollte.

himitsu 6. Mär 2017 17:13

AW: Umlaute und Sonderzeichen "lesbar" ersetzen
 
Bei unserem DMS hatte ich es anfangs auch so gebaut, dass alles mit Realnamen gespeichert wurde,
mit dem Ergebnis, dass irgendwann mal Dateien überschrieben wurden. (ein Unterverzeichnis pro Monat und Dokumenttyp und wenn dann im selben Monat 2 Dateien den selben Namen haben ...)
Da wurde dann die Dokument-ID aus der DB in den Dateinamen eingebaut.

Später knallte es wieder alle paar Monate, weil ich ein Sonderzeichen vergaß zu ersetzen und ein Kunde ausgerechnet dieses Zeichen in nem Dateinamen hatte.
Fazit: Alles flog letztendlich wieder raus und im Dateisystem gibt es nun nur noch IDs/GUIDs und fertig. Die Dateien sieht eh niemand, da sie nur über 'nen Server an die Clienten gegeben werden.

Zitat:

..255
Und was macht ihr mit den anderen 50.000 Zeichen im Unicodesystem?


Zitat:

Delphi-Quellcode:
function ZeichenErsetzen(sIn : String) : String;
var
  i : Integer;
begin
  Result := '';
  for i := 1 to Length(sIn) do begin
    Case sIn[i] Of

Da diese Funktion nicht ersetzt, sondern "neu anhängt", wird der Code ab Delphi 2009 viel Spaß bereiten und schnell mal Zeichen "löschen".


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