AGB  ·  Datenschutz  ·  Impressum  







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

Umlaute in Windows

Ein Thema von Hansa · begonnen am 2. Okt 2002 · letzter Beitrag vom 3. Okt 2002
Antwort Antwort
Seite 1 von 2  1 2      
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#1

Umlaute in Windows

  Alt 2. Okt 2002, 14:37
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.

Gruß
Hansa
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#2
  Alt 2. Okt 2002, 14: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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Daniel B
(Gast)

n/a Beiträge
 
#3
  Alt 2. Okt 2002, 16:55
Hi,

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

Grüsse, Daniel
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#4
  Alt 2. Okt 2002, 17: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. Dann ist Handarbeit angesagt.

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

Gruß
Hansa
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#5
  Alt 2. Okt 2002, 17: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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#6
  Alt 2. Okt 2002, 17:23
Danke Daniel,

das müsste das gesuchte sein, werde es mal einbauen. Wußte ja sowieso schon wie es geht, aber nicht wie.

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
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#7
  Alt 2. Okt 2002, 17: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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#8
  Alt 2. Okt 2002, 17: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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#9
  Alt 2. Okt 2002, 17: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];
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#10
  Alt 2. Okt 2002, 18: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. 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]
  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 22:09 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