Delphi-PRAXiS
Seite 2 von 3     12 3      

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)

DeddyH 4. Jul 2014 10:27

AW: Stringkonvertierung
 
Ich hatte ja noch einmal editiert. Trotzdem: wenn der Hersteller schon schreibt
Zitat:

Warning Do not use.
dann nehme ich das ernst.

p80286 4. Jul 2014 10:30

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:
for i:=1 to length(mystring) do
  mystring[i]:=asciitab[mystring[i]];
Die kannst Du anpassen wie Du es gerne hättest.
(diesen OEmtoAnsi's traue ich nur so weit wie ich sie selbst geschrieben habe)

Gruß
K-H

DeddyH 4. Jul 2014 10:42

AW: Stringkonvertierung
 
Zitat:

Zitat von Blup (Beitrag 1264410)
Zitat:

Security Considerations

Using this function incorrectly can compromise the security of your application.
Ich hab nicht vor diese Funktion inkorrekt zu benutzen.

Nach genauerer Betrachtung tust Du das aber. Die Deklaration als AnsiString/PAnsiChar bewirkt ja nicht, dass da nun CharToOEMA/OEMToCharA aufgerufen wird, das muss man schon explizit tun. Deshalb gilt
Zitat:

If the OemToChar function is being used as an ANSI function, the string can be translated in place by setting the lpszDst parameter to the same address as the lpszSrc parameter. This cannot be done if OemToChar is being used as a wide-character function.
auch weiterhin, zumindest ab Delphi 2009.

Uwe Raabe 4. Jul 2014 11:05

AW: Stringkonvertierung
 
Zitat:

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

Du kannst doch bei AssignFile als dritten Parameter die Codepage mitgeben.

Delphi-Quellcode:
AssignFile(fDatei, aDatei, 1);

himitsu 4. Jul 2014 11:24

AW: Stringkonvertierung
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1264430)
Du kannst doch bei AssignFile als dritten Parameter die Codepage mitgeben.

Delphi-Quellcode:
AssignFile(fDatei, aDatei, 1);

War das nicht die Rect-Größe?
[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)

Blup 4. Jul 2014 16:04

AW: Stringkonvertierung
 
Zitat:

Zitat von DeddyH (Beitrag 1264419)
Nach genauerer Betrachtung tust Du das aber. Die Deklaration als AnsiString/PAnsiChar bewirkt ja nicht, dass da nun CharToOEMA/OEMToCharA aufgerufen wird, das muss man schon explizit tun. Deshalb gilt
Zitat:

If the OemToChar function is being used as an ANSI function, the string can be translated in place by setting the lpszDst parameter to the same address as the lpszSrc parameter. This cannot be done if OemToChar is being used as a wide-character function.
auch weiterhin, zumindest ab Delphi 2009.

Wenn ich das richtig verstehe ruft die Funktion OemToChar
bis Delphi 2007 -> OemToCharA
ab Delphi 2009 -> OemToCharW auf.
Ok, dann häng ich da gleich noch ein A dran...

himitsu 4. Jul 2014 17:01

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.

Sir Rufo 4. Jul 2014 18:09

AW: Stringkonvertierung
 
Ich würde das ja noch komplizierter machen :mrgreen:

Nein, ich bin faul:
Delphi-Quellcode:
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;
Dieses ganze Oem/Ansi Hin-und-Her macht doch nur schwindelig im Kopf ;)

himitsu 4. Jul 2014 18:21

AW: Stringkonvertierung
 
Delphi-Quellcode:
type
  OemString = type AnsiString(CP_OEMCP);

var
  F: TextFile;
  S: OEMString;
begin
  ReadLn(F, S);
Delphi-Quellcode:
var
  F: TextFile;
  S: AnsiString;
begin
  ReadLn(F, S);
  SetCodePage(S, CP_OEMCP, False);
:angel:

himitsu 4. Jul 2014 18:30

AW: Stringkonvertierung
 
Zitat:

Zitat von Sir Rufo (Beitrag 1264489)
Nein, ich bin faul:

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:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:32 Uhr.
Seite 2 von 3     12 3      

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