![]() |
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: |
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; |
AW: Umlaute und Sonderzeichen "lesbar" ersetzen
Zitat:
|
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 ![]() ![]() |
AW: Umlaute und Sonderzeichen "lesbar" ersetzen
Du kannst WideCharToMultoByte verwenden und nach ASCII konvertieren, wobei z.B. aus ó auch o werden.
|
AW: Umlaute und Sonderzeichen "lesbar" ersetzen
Zitat:
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. :-/ |
AW: Umlaute und Sonderzeichen "lesbar" ersetzen
Du suchst sowas:
Delphi-Quellcode:
lediglich auf alle Sprachen erweitert ;-)
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; Zitat:
Ohne eine klare Vorgabe zu der / den unterstützten Sprache(n) und klaren "Übersetzungsanweisungen" wird das nix. |
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 |
AW: Umlaute und Sonderzeichen "lesbar" ersetzen
Zitat:
Delphi-Quellcode:
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.
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; |
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:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:54 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