AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Umlaute und Sonderzeichen "lesbar" ersetzen

Ein Thema von uligerhardt · begonnen am 6. Mär 2017 · letzter Beitrag vom 6. Mär 2017
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#1

Umlaute und Sonderzeichen "lesbar" ersetzen

  Alt 6. Mär 2017, 14:43
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.
Uli Gerhardt
  Mit Zitat antworten Zitat
t.roller
(Gast)

n/a Beiträge
 
#2

AW: Umlaute und Sonderzeichen "lesbar" ersetzen

  Alt 6. Mär 2017, 14:53
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;

Geändert von t.roller ( 6. Mär 2017 um 15:24 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#3

AW: Umlaute und Sonderzeichen "lesbar" ersetzen

  Alt 6. Mär 2017, 14:57
Danke, aber die explizite Auflistung aller (oder - im verlinkten Beispiel - eben nicht aller (ó, È, ...)) Kandidaten ist ja genau das, was ich vermeiden will.
Uli Gerhardt
  Mit Zitat antworten Zitat
t.roller
(Gast)

n/a Beiträge
 
#4

AW: Umlaute und Sonderzeichen "lesbar" ersetzen

  Alt 6. Mär 2017, 15:28
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.

Geändert von t.roller ( 6. Mär 2017 um 15:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#5

AW: Umlaute und Sonderzeichen "lesbar" ersetzen

  Alt 6. Mär 2017, 15:35
Du kannst WideCharToMultoByte verwenden und nach ASCII konvertieren, wobei z.B. aus ó auch o werden.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#6

AW: Umlaute und Sonderzeichen "lesbar" ersetzen

  Alt 6. Mär 2017, 15:36
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. :-/
Uli Gerhardt
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#7

AW: Umlaute und Sonderzeichen "lesbar" ersetzen

  Alt 6. Mär 2017, 16:18
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

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.

Geändert von nahpets ( 6. Mär 2017 um 16:40 Uhr) Grund: Schreibfehler behoben - #65 musste beim zweiten Mal #97 sein.
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.798 Beiträge
 
Delphi 12 Athens
 
#8

AW: Umlaute und Sonderzeichen "lesbar" ersetzen

  Alt 6. Mär 2017, 16:21
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
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#9

AW: Umlaute und Sonderzeichen "lesbar" ersetzen

  Alt 6. Mär 2017, 16:39
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#10

AW: Umlaute und Sonderzeichen "lesbar" ersetzen

  Alt 6. Mär 2017, 18:13
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".
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 6. Mär 2017 um 18:19 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:01 Uhr.
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