![]() |
Umlaute in Windows
Hi Leute,
ich habe hier einen alten Datenbestand, den will ich in eine DB importieren. Es ist aber eine reine ASCII Datei mit deutschen Umlauten. Letztere werden in Windows falsch dargestellt. Soll ich versuchen die Ascii - Datei, so umzubauen, daß Windows damit klar kommt, oder sie lieber so lassen wie sie ist und beim Importieren zusehen, daß es richtig ankommt. Wobei ich weder weiß, wie das erste gehen würde noch das zweite. :mrgreen: Gruß Hansa |
Moin Hansa,
versuch's mal mit OemToChar bzw. CharToOem. (für den ersten Fall). Wenn Du Dir ganz sicher bist, dass es sich nur um ä,ö,ü,Ä,Ö,Ü und ß handelt und nicht vielleicht noch französische, spanische .... Zeichen enthalten sind, käme vielleicht noch eine selbstgestrickte Funktion in Frage. Aber versuch's erst einmal mit den genannten Funktionen. |
Hi,
vielleicht bringt Dich das auf neue Gedanken... ![]() Grüsse, Daniel :hi: |
Hallo Chris,
Zitat:
Wo ist das OemToChar usw. ? Hab ich noch gar nicht gesehen. Gruß Hansa |
Moin Hansa,
mach mal eine Konsole auf, und starte dort mal Edit (also den DOS Editor, wichtig!) Jetzt die sieben deutschen Sonderzeichen eingeben, und als c:\oemtest.txt speichern. Wenn Du jetzt
Code:
mal probierst, wirst Du die Wirkung von OemToChar sehen können.
[b]procedure[/b] TForm1.Button1Click(Sender: TObject);
[b]var[/b] fsWork : TFileStream; sWork : [b]string[/b]; [b]begin[/b] fsWork := TFileStream.Create('c:\oemtest.txt',fmOpenRead); [b]try[/b] sWork := StringOfChar(#00,fsWork.Size); fsWork.Read(sWork[1],fsWork.Size); [b]finally[/b] FreeAndNil(fsWork); [b]end[/b]; ShowMessage(sWork); OemToChar(@sWork[1],@sWork[1]); ShowMessage(sWork); [b]end[/b]; |
Danke Daniel,
das müsste das gesuchte sein, werde es mal einbauen. Wußte ja sowieso schon wie es geht, aber nicht wie. :mrgreen: Das hier war mal eine Funktion, die ich gemacht habe, um so etwas ähnliches zu bereinigen:
Code:
Sieht fast genauso aus, oder?
FUNCTION gross (inp : string) : string; (* Achtung : UpCase klappt *)
VAR i : integer; (* nicht bei 'a.ö,ü' *) BEGIN FOR i := 0 TO length(inp) DO BEGIN gross[i] := UpCase(inp[i]); IF ord(inp[i]) > 122 THEN BEGIN (* 122 = 'z' *) CASE inp[i] OF 'ä' : gross[i] := 'Ä'; 'ö' : gross[i] := 'Ö'; 'ü' : gross[i] := 'Ü'; END; END; END; END; Gruß Hansa |
Hallo Christian,
Auch Danke für die Antwort. Aber es handelt sich ja um einen einmaligen Vorgang. Sollte es so gehen, wie Daniel schreibt (ich meine das im Link), um so besser. Das verstehen dann auch noch andere hier, die so etwas dann im Fall der Fälle durchziehen könnten. Gruß Hansa |
Moin Hansa,
das hättest Du mit AnsiUpperCase aber einfacher haben können ;-) Die Funktion erledigt das mit einem Aufruf. Bevor ich OemToChar kannte hab' ich's, im Prinzip, mal so gelöst:
Code:
Absolut nicht ideal, aber tut's.
[b]function[/b] DosToWin([b]const[/b] p_sLine : [b]string[/b]) : [b]string[/b];
[b]begin[/b] Result := StringReplace(p_sLine,chr($84),'ä',[rfReplaceAll]); Result := StringReplace(p_sLine,chr($94),'ö',[rfReplaceAll]); Result := StringReplace(p_sLine,chr($81),'ü',[rfReplaceAll]); Result := StringReplace(p_sLine,chr($8E),'Ä',[rfReplaceAll]); Result := StringReplace(p_sLine,chr($99),'Ö',[rfReplaceAll]); Result := StringReplace(p_sLine,chr($9A),'Ü',[rfReplaceAll]); Result := StringReplace(p_sLine,chr($E1),'ß',[rfReplaceAll]); [b]end[/b]; Leider kostet der Komfort bei der Stringverarbeitung in Delphi ziemlich viel Zeit. Deshalb bin ich inzwischen mehr auf Pointer bzw. Assembler ausgewichen, wenn es um umfangreichen Stringverarbeitung geht. Das spart Laufzeit ohne Ende. |
Moin Hansa,
das was in Daniel's Link zu sehen ist, finde ich allerdings etwas aufwändiger, als eine Zeile OemToChar ;-) Mein Beispiel sollte Dir nur zeigen, wie's vor und nach dem Aufruf aussieht. Du kannst Du Ascii Datei ja auch in einem Rutsch in einen Filestream einlesen, mit OemToChar umwandeln, und wieder zurückschreiben. Die Länge ändert sich ja nicht. Da auch im Deutschen, z.B. Namen, französische Zeichen enthalten können, halte ich die Beschränkung auf deutsche Umlaute jedenfalls für gefährlich. So wäre es allgemein brauchbar (ausser für Unicode):
Code:
[b]procedure[/b] TForm1.Button1Click(Sender: TObject);
[b]var[/b] fsWork : TFileStream; sWork : [b]string[/b]; [b]begin[/b] [b]if[/b] OpenDialog1.Execute [b]then[/b] [b]begin[/b] fsWork := TFileStream.Create(OpenDialog1.FileName,fmOpenRead); [b]try[/b] sWork := StringOfChar(#00,fsWork.Size); fsWork.Read(sWork[1],fsWork.Size); [b]finally[/b] FreeAndNil(fsWork); [b]end[/b]; OemToChar(@sWork[1],@sWork[1]); fsWork := TFileStream.Create(OpenDialog1.FileName+'.conv',fmCreate); [b]try[/b] fsWork.Write(sWork[1],Length(sWork)); [b]finally[/b] FreeAndNil(fsWork); [b]end[/b]; [b]end[/b]; [b]end[/b]; |
Hi Chris,
Zitat:
Das ganze hat auch nur indirekt mit Delphi zu tun. Ich kriege eine Ascii - Datei geliefert, die soll in eine Interbase-DB rein (mit EXTERNAL FILE usw.). Das natürlich möglichst schön, vielleicht auch mit franz. Zeichen, aber viele sind das nicht. In Interbase zeigt er mir halt im Moment die Umlaute falsch an. Später mit dem Delphi-Programm juckt mich das ganze dann nicht mehr, sofern die Umlaute dann wieder stimmen. Jetzt kommt mein alter Ansatz wieder ins Spiel: notfalls Zeichen für Zeichen lesen und mittels CASE und Daniels Tip einzelne Zeichen umwandeln und in eine zweite Datei schreiben. Diese würde ich dann mit Interbase importieren und das wärs dann. Gruß Hansa [/quote] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:10 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