Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Umlaute in Windows (https://www.delphipraxis.net/965-umlaute-windows.html)

Hansa 2. Okt 2002 13:37


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

Christian Seehase 2. Okt 2002 13:58

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.

Daniel B 2. Okt 2002 15:55

Hi,

vielleicht bringt Dich das auf neue Gedanken...
http://www.delphipraxis.net/viewtopic.php?t=848

Grüsse, Daniel :hi:

Hansa 2. Okt 2002 16:01

Hallo Chris,

Zitat:

Wenn Du Dir ganz sicher bist, dass es sich nur um ä,ö,ü,Ä,Ö,Ü und ß handelt und nicht vielleicht noch französische, spanische ....
Falls das der Fall ist, können die mich mal. :mrgreen: Dann ist Handarbeit angesagt.

Wo ist das OemToChar usw. ? Hab ich noch gar nicht gesehen.

Gruß
Hansa

Christian Seehase 2. Okt 2002 16:15

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:
[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];
mal probierst, wirst Du die Wirkung von OemToChar sehen können.

Hansa 2. Okt 2002 16:23

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:
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;
Sieht fast genauso aus, oder?

Gruß
Hansa

Hansa 2. Okt 2002 16:29

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

Christian Seehase 2. Okt 2002 16:40

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:
[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];
Absolut nicht ideal, aber tut's.

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.

Christian Seehase 2. Okt 2002 16:45

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];

Hansa 2. Okt 2002 17:29

Hi Chris,


Zitat:

das hättest Du mit AnsiUpperCase aber einfacher haben können
Die Funktion erledigt das mit einem Aufruf
Weiß der Kuckuck, aber da war ja der Fehler drinne. :bounce1: Es ging nur so (laut Borland ein Bug).

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 03:24 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