![]() |
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 |
AW: Stringkonvertierung
Wie lädst du die Datei in Delphi?
|
AW: Stringkonvertierung
Delphi-Quellcode:
Sah gut aus.
const
Test = 'Achtung Farb„nderung'; var s: string; begin SetLength(s, Length(Test)); OEMToCharBuff(PAnsiChar(Test), PChar(s), Length(Test)); ShowMessage(s); end; |
AW: Stringkonvertierung
Zitat:
Delphi-Quellcode:
und dann mit while not Eof(fDatei) jede Zeile lesen
AssignFile(fDatei, aDatei);
{$I-}Reset(fDatei); {$I+ } |
AW: Stringkonvertierung
Für den einfachsten Fall sollte das genügen:
Delphi-Quellcode:
Wer arbeitet eigentlich noch mit Readln?
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); {...} |
AW: Stringkonvertierung
Zitat:
|
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] |
AW: Stringkonvertierung
Zitat:
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 |
AW: Stringkonvertierung
Vllt. was zur Codierung, könnte helfen:
Zitat:
![]() |
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:
Zitat:
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); |
AW: Stringkonvertierung
Ich hatte ja noch einmal editiert. Trotzdem: wenn der Hersteller schon schreibt
Zitat:
|
AW: Stringkonvertierung
Nun wenn Du die Daten nicht mehr zurück liefern mußt, dann laß doch gleich alles durch eine Übersetzungstabelle laufen:
Delphi-Quellcode:
Die kannst Du anpassen wie Du es gerne hättest.
for i:=1 to length(mystring) do
mystring[i]:=asciitab[mystring[i]]; (diesen OEmtoAnsi's traue ich nur so weit wie ich sie selbst geschrieben habe) Gruß K-H |
AW: Stringkonvertierung
Zitat:
Zitat:
|
AW: Stringkonvertierung
Zitat:
Delphi-Quellcode:
AssignFile(fDatei, aDatei, 1);
|
AW: Stringkonvertierung
Zitat:
[edit] Halt, RecSize wurde beim Reset/Rewrite angegeben. :gruebel: Aber dem AnsiString-Read/ReadLn kann man die CodePage mitgeben. (laut dem QuellCode der XE-System.pas) |
AW: Stringkonvertierung
Zitat:
bis Delphi 2007 -> OemToCharA ab Delphi 2009 -> OemToCharW auf. Ok, dann häng ich da gleich noch ein A dran... |
AW: Stringkonvertierung
Eigentlich sollte OemToCharA ja OemCP_to_AnsiCP heißen, womit dann auch klarer wird, warum da keiner an Unicode gedacht hat.
Außerden ist OEM nunmal eine ANSI-CodePage und hat damit auch garnichts in einem UnicodeString zu suchen. Also wenn, dann sollte man es doch besser richtig machen, also via MultiByteToWideChar von CP_OEMCP nach Unicode. Und warum MS von dessen Verwendung abrät, liegt daran, daß viele es verwenden, um InSpace die einzelnen "SingleByte"-Zeichen der OEM-CP in die Ansi-CP umzuwandeln. Da aber je nach Ansi-CP das eben auch mal eine MultyByte-CodePage sein kann und fast kein Schwein das beachtet, gibt es da ein Problem mit der Puffergröße und es endet zu oft in einem Buffer-Overflow. z.B. Deutsch und Englisch sind ja SingleByte ... drum merken es viele Programmierer garnicht, daß sie totalen Mist verzapft haben. So sind also auch alle hier gezeigten Lösungsvorschläge nicht unbedingt "sicher" oder zumindestens funktionieren nicht immer richtig (siehe #12). :angel: Darum ist das Dateisystem nun eben auch immer englisch und wird lokalisiert, genausio wie das Systemlaufwerk auch fast immer nur noch C: ist, da zuviele Idioten mit hardgecodeten Pfaden arbeiten. |
AW: Stringkonvertierung
Ich würde das ja noch komplizierter machen :mrgreen:
Nein, ich bin faul:
Delphi-Quellcode:
Dieses ganze Oem/Ansi Hin-und-Her macht doch nur schwindelig im Kopf ;)
function ReadDataNormFile( const ADataNormFilename : string ) : string;
var LText : TStrings; begin LText := TStringList.Create; try LText.LoadFromFile( ADataNormFilename, {System.SysUtils} TEncoding.GetEncoding( {Winapi.Windows} CP_OEMCP ) ); Result := LText.Text; finally LText.Free; end; end; |
AW: Stringkonvertierung
Delphi-Quellcode:
type
OemString = type AnsiString(CP_OEMCP); var F: TextFile; S: OEMString; begin ReadLn(F, S);
Delphi-Quellcode:
:angel:
var
F: TextFile; S: AnsiString; begin ReadLn(F, S); SetCodePage(S, CP_OEMCP, False); |
AW: Stringkonvertierung
Zitat:
Delphi-Quellcode:
Result := TFile.ReadAllText(ADataNormFilename, TEncoding.GetEncoding(CP_OEMCP)); // Wobei man doch die TEncoding-Instanz eigentlich auch wieder greigeben müsste?
Du bist noch nicht faul genug. :lol: |
AW: Stringkonvertierung
Zitat:
Huch, das kennt das ja doch schon :) ok |
AW: Stringkonvertierung
Guten Tag Delphianer,
vielen Dank an allen die bei der Lösung des Problems geholfen haben. Letztendlich hab ich den Vorschlag von Uwe Raabe genommen: Zitat:
Jetzt kann ich auch weiter an die Erneuerung des Quellcodes gehen. Das Thema kann nun geschlossen werden. Mit besten Gruß HPB |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:58 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 by Thomas Breitkreuz