Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Stringkonvertierung (https://www.delphipraxis.net/180970-stringkonvertierung.html)

HPB 4. Jul 2014 08:52

Stringkonvertierung
 
Guten Tag Delphianer,
ich habe folgendes Problem bei der Konvertierung von Strings:
in einer Datei (DATANORM) steht folgende Zeile:

Dyckerhoff Zement CEM II 32,5 R, 25 kg;(Achtung Farb„nderung)

wenn ich die Datei mit dem TotelCommander öffne (Lister) steht folgendes:
Dyckerhoff Zement CEM II 32,5 R, 25 kg;(Achtung Farbänderung)

also die korrekte Umsetzung.

Der TotalCommander benutzt die ASCII-Codierung (ANSI/DOS (lokale Codeseite (1), wie feststellen konnte.
Stelle ich die Codierung im TotalCommander zu Testzwecken um, werden für die Umlaute wieder andere Zeichen dargestellt.

Aber wie kann ich die korrekte Darstellung, Umwandlung erreichen?
Mit welchem Befehl, Funktion kann die Umwandlung gelingen?
Die Umwandlung mit UTF8..., OEMTo... habe ich alles versucht. War aber nicht mit Erfolg gekrönt.
Vielen Dank für Eure Mühen.
Gruß
HPB

mkinzler 4. Jul 2014 09:00

AW: Stringkonvertierung
 
Wie lädst du die Datei in Delphi?

DeddyH 4. Jul 2014 09:01

AW: Stringkonvertierung
 
Delphi-Quellcode:
const
  Test = 'Achtung Farb„nderung';
var
  s: string;
begin
  SetLength(s, Length(Test));
  OEMToCharBuff(PAnsiChar(Test), PChar(s), Length(Test));
  ShowMessage(s);
end;
Sah gut aus.

HPB 4. Jul 2014 09:02

AW: Stringkonvertierung
 
Zitat:

Zitat von mkinzler (Beitrag 1264386)
Wie lädst du die Datei in Delphi?

Delphi-Quellcode:
  AssignFile(fDatei, aDatei);
{$I-}Reset(fDatei);
{$I+ }
und dann mit while not Eof(fDatei) jede Zeile lesen

Blup 4. Jul 2014 09:08

AW: Stringkonvertierung
 
Für den einfachsten Fall sollte das genügen:
Delphi-Quellcode:
function AnsiToOem(const AValue: AnsiString): AnsiString;
begin
  Result := AValue;
  if Length(Result) <> 0 then
    CharToOem(PAnsiChar(Result), PAnsiChar(Result));
end;

function OemToAnsi(const AValue: AnsiString): AnsiString;
begin
  Result := AValue;
  if Length(Result) <> 0 then
    OemToChar(PAnsiChar(Result), PAnsiChar(Result));
end;

var
  sl: TStringList;
begin
  sl.LoadFromFile('Oem.txt');
  sl.Text := OemToAnsi(sl.Text);
  {...}
Wer arbeitet eigentlich noch mit Readln?

HPB 4. Jul 2014 09:10

AW: Stringkonvertierung
 
Zitat:

Zitat von DeddyH (Beitrag 1264387)
Delphi-Quellcode:
const
  Test = 'Achtung Farb„nderung';
var
  s: string;
begin
  SetLength(s, Length(Test));
  OEMToCharBuff(PAnsiChar(Test), PChar(s), Length(Test));
  ShowMessage(s);
end;
Sah gut aus.

Habe ich gerade ausprobiert. Die Umlaute sind nicht vorhanden.

DeddyH 4. Jul 2014 09:12

AW: Stringkonvertierung
 
Komisch, bei mir schon.

[edit] @Blup: Lies mal die Bemerkungen zu OEMToChar/CharToOEM, Dein Code wird unter Delphi > 2007 knallen. Außerdem rät Microsoft selbst von der Verwendung ab.[/edit]
[edit2] Sry, ich hab übersehen, dass Du alles als AnsiStrings deklariert hast. Damit bleibt nur noch Punkt 2. [/edit2]

HPB 4. Jul 2014 09:18

AW: Stringkonvertierung
 
Zitat:

Zitat von Blup (Beitrag 1264392)
Für den einfachsten Fall sollte das genügen:
[delphi]
Wer arbeitet eigentlich noch mit Readln?

Ich. Alter Mann (immerhin 69 Jahre), altes Programm, altes Wissen. Passt doch alles zusammen.
Bin gerade dabei ein uralt Programm umzuschreiben. Es wird nicht gleich alles neu gemacht.
Erst einmal die korrekten Daten bekommen, dann alles weitere.
Gruß HPB

Jumpy 4. Jul 2014 09:20

AW: Stringkonvertierung
 
Vllt. was zur Codierung, könnte helfen:

Zitat:

Die DATANORM-Schnittstelle ist auf eine minimale Hardware-Konfiguration zugeschnitten und erlaubt somit den weitreichenden Einsatz. Alle Datensätze bestehen aus reinem ASCII-Text, wobei jeder Satz exakt 128 Zeichen lang und durch eine Zeichenschaltung (Carriage return/0DH 0AH) abgeschlossen ist.

Der erlaubte Zeichenvorrat lehnt sich an den IBM-Zeichensatz an, wobei jedoch nur die unteren 128 Zeichen erlaubt sind. Lediglich die deutschen Sonderzeichen bilden hier eine Ausnahme und tragen weiterhin die Positionscodes des erweiterten ASCII-Zeichensatzes.
Quelle:
http://www.textarchiv.alojado.de/tex...en-ap1387.html

Blup 4. Jul 2014 10:15

AW: Stringkonvertierung
 
Dann stimmt vermutlich die im Windows eingestellte OEM-Code-Page nicht.
Stell mal in den Ländereinstellungen auf Englisch(USA) und speichern.
Danach wieder auf Deutschland(Deutsch), speichern und Windows neu starten.

Zitat:

[edit] @Blup: Lies mal die Bemerkungen zu OEMToChar/CharToOEM, Dein Code wird unter Delphi > 2007 knallen. Außerdem rät Microsoft selbst von der Verwendung ab.[/edit]
Zitat:

Security Considerations

Using this function incorrectly can compromise the security of your application.
Ich hab nicht vor diese Funktion inkorrekt zu benutzen. Deshalb auch schön in eigene Funktionen gekapselt die mit AnsiString und PAnsiChar arbeiten.
Das sollte auch nach Delphi 2007 keine Probleme verursachen.

In neueren Delphi-Versionen könnte man auch das mal versuchen, kann ich aber grad nicht testen:
Delphi-Quellcode:
function ConvertCodePage(const S: _RawByteStr; AFromCodePage, AToCodepage: Word): _RawByteStr;
begin
  Result := S;
  SetCodePage(Result, AFromCodePage, False); // Codepage der Ausgangsdaten nur festlegen
  SetCodePage(Result, AToCodepage, True);   // Codepage umstellen und Daten konvertieren
end;

sl.Text := ConvertCodePage(sl.Text, 437, 850);


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:54 Uhr.
Seite 1 von 3  1 23      

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