Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi 1-Byte-Char in BDS2010 (https://www.delphipraxis.net/166785-1-byte-char-bds2010.html)

LeisureSuitLarry 29. Feb 2012 08:06

1-Byte-Char in BDS2010
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich habe folgendes Problem:

beim Einlesen einer Textdatei mit mehreren Char-Feldern ist die Satzlänge doppelt so hoch. Delpi2010 scheint für ein Char 2 Byte zu verwenden.

Die Projekteinstellungen habe ich angehängt. Gibt es eine Art ShortChar?

Grüße
Manfred

himitsu 29. Feb 2012 08:08

AW: 1-Byte-Char in BDS2010
 
Nicht nur scheint, sondern es ist so.
Seit Delphi/RAD 2009 ist Unicode der Standard und davor war es ANSI.

Char
AnsiChar
WideChar
PChar
PAnsiChar
PWideChar
String
ShortString
AnsiString
WideString
UnicodeString

BDS? Es heißt jetzt RAD. :wink:

DeddyH 29. Feb 2012 08:12

AW: 1-Byte-Char in BDS2010
 
Oder anders ausgedrückt:
Delphi bis 2007
- Char = AnsiChar
- PChar = PAnsiChar
- String = AnsiString

Delphi ab 2009
- Char = WideChar
- PChar = PWideChar
- String = UnicodeString

LeisureSuitLarry 29. Feb 2012 08:24

AW: 1-Byte-Char in RAD2010
 
Danke für die schnellen Antworten.

Wie bekomme ich jetzt Daten eingelesen, die Daten mit fester Feldlänge enthält?

Zum Beispiel:
000001Herr Max Mustermann Testr. 1 12345Musterhausen

Grüße
Manfred

DeddyH 29. Feb 2012 08:29

AW: 1-Byte-Char in BDS2010
 
Z.B. mit einem Array of AnsiChar oder einem String mit fester Länge (z.B. string[50]), die sind AFAIK immer Ansi.

LeisureSuitLarry 29. Feb 2012 08:33

AW: 1-Byte-Char in RAD2010
 
Danke.
Die Satzlänge ist leider 361 Zeichen.

vagtler 29. Feb 2012 08:34

AW: 1-Byte-Char in RAD2010
 
Zitat:

Zitat von LeisureSuitLarry (Beitrag 1153597)
[...] Die Satzlänge ist leider 361 Zeichen.

Äh, ja. Und?

DeddyH 29. Feb 2012 08:36

AW: 1-Byte-Char in BDS2010
 
Dann nimm doch das Array of AnsiChar, oder deklarier einfach einen AnsiString und kopier da die 361 Zeichen raus (je nachdem, wie Du einliest).

LeisureSuitLarry 29. Feb 2012 08:49

AW: 1-Byte-Char in BDS2010
 
Einen Ansistring einlesen geht erst mal.
Dummerweise ist die Datei CP850 kodiert.

DeddyH 29. Feb 2012 08:59

AW: 1-Byte-Char in BDS2010
 
Hilft Dir MSDN-Library durchsuchenOemToChar evtl. weiter?

[edit] Oder wohl besser MSDN-Library durchsuchenOemToCharBuff, wenn man die Warnung beachtet. [/edit]

Bummi 29. Feb 2012 09:06

AW: 1-Byte-Char in BDS2010
 
vielleicht willst Du die Funktion LoadFileWithEncoding verwenden ....

Delphi-Quellcode:
unit ConvertCodePage;
// 20120116 by Thomas Wassermann
interface
uses Classes,Sysutils;

Procedure ConverCodePage(Const fn:String; FromCP, ToCP:Integer);
Procedure LoadFileWithEncoding(const fn:String; CodePage:Integer;sl:TStringList);
Procedure SaveFileWithEncoding(const fn:String; CodePage:Integer;sl:TStringList);

implementation

Procedure LoadFileWithEncoding(const fn:String; CodePage:Integer;sl:TStringList);
var
  enc:TEncoding;
begin
   enc := TEncoding.GetEncoding(CodePage);
   try
   sl.LoadFromFile(fn,enc);
   finally
     enc.Free;
   end;
end;

Procedure SaveFileWithEncoding(const fn:String; CodePage:Integer;sl:TStringList);
var
  enc:TEncoding;
begin
   enc := TEncoding.GetEncoding(CodePage);
   try
   sl.SaveToFile(fn,enc);
   finally
     enc.Free;
   end;
end;

Procedure ConverCodePage(Const fn:String; FromCP, ToCP:Integer);
var
 sl : TStringList;
begin
  sl := TStringList.Create;
  LoadFileWithEncoding(fn, FromCP , sl);
  SaveFileWithEncoding(fn, ToCP  , sl);
  sl.Free;
end;


end

himitsu 29. Feb 2012 09:12

AW: 1-Byte-Char in BDS2010
 
Man kann dem AnsiString auch direkt die CodePage mitgeben, wobei Delphi dann (meistens) die gewünschte CodePage nutzt, wenn es automatisch konvertieren soll.

Delphi-Referenz durchsuchenSetAnsiString

Delphi-Referenz durchsuchenStringElementSize
Delphi-Referenz durchsuchenStringCodePage
Delphi-Referenz durchsuchenStringRefCount
Delphi-Referenz durchsuchenSetCodePage

Es gibt sogar ein
Delphi-Quellcode:
ReadLString(var t: TTextRec; var s: AnsiString; CodePage: Word);
, wobei ich nicht genau weiß, wie man das nutzt.
Theoretisch sollte es eine der internen Funktionen für Read und ReadLn sein.
Eventuell wird es ja automatisch genutzt, wenn man dem StringTyp die Codepage mitgibt, so wie z.B. die Codepage 65001 für den Delphi-Referenz durchsuchenUTF8String.
Delphi-Quellcode:
type
  UTF8String = type AnsiString(65001);
  OEMString = type AnsiString(850); // oder = type AnsiString(CP_OEMCP)

LeisureSuitLarry 29. Feb 2012 09:29

AW: 1-Byte-Char in BDS2010
 
Bummis Vorschlag klingt gut...
Kann aber erst später weiter machen...

Danke für Eure Hilfe!

Grüße
Manfred

DeddyH 29. Feb 2012 09:38

AW: 1-Byte-Char in BDS2010
 
@Bummi: wieso in Gottes Namen übergibst Du die Listen als Variablenparameter?

Bummi 29. Feb 2012 09:53

AW: 1-Byte-Char in BDS2010
 
@Deddy
war ein nicht endbereinigter Code, bei dem Ursprünglich wenn nicht assigned Stringlisten erzeugt wurden

DeddyH 29. Feb 2012 10:01

AW: 1-Byte-Char in BDS2010
 
Das macht in dem Zusammenhang aber auch keinen Sinn, was soll denn dann gespeichert werden? Naja, egal, das "var" weg (und vielleicht TStringlist durch TStrings ersetzen) und gut is ;)

Iwo Asnet 29. Feb 2012 10:25

AW: 1-Byte-Char in BDS2010
 
Zitat:

Zitat von DeddyH (Beitrag 1153621)
...und gut is ;)

Nen Class Helper draus machen und 'besser' is?

DeddyH 29. Feb 2012 10:26

AW: 1-Byte-Char in BDS2010
 
Class Helper für welche Klasse?

vagtler 29. Feb 2012 11:04

AW: 1-Byte-Char in BDS2010
 
Zitat:

Zitat von DeddyH (Beitrag 1153628)
Class Helper für welche Klasse?

Lass mal raten: TStrings? ;)

DeddyH 29. Feb 2012 13:00

AW: 1-Byte-Char in BDS2010
 
Wenn es sonst niemand macht:
Delphi-Quellcode:
type
  TStringsCodePageHelper = class helper for TStrings
  public
    procedure ConvertFileCodePage(const Filename: string; FromCP, ToCP: Integer);
    procedure LoadFileWithEncoding(const Filename: String; CodePage: Integer);
    procedure SaveFileWithEncoding(const Filename: String; CodePage: Integer);
  end;

procedure TStringsCodePageHelper.ConvertFileCodePage(const Filename: string; FromCP,
  ToCP: Integer);
begin
  LoadFileWithEncoding(Filename, FromCP);
  SaveFileWithEncoding(Filename, ToCP);
end;

procedure TStringsCodePageHelper.LoadFileWithEncoding(const Filename: String;
  CodePage: Integer);
var
  Encoding: TEncoding;
begin
  Encoding := TEncoding.GetEncoding(CodePage);
  try
    LoadFromFile(Filename, Encoding);
  finally
    Encoding.Free;
  end;
end;

procedure TStringsCodePageHelper.SaveFileWithEncoding(const Filename: String;
  CodePage: Integer);
var
  Encoding: TEncoding;
begin
  Encoding := TEncoding.GetEncoding(CodePage);
  try
    SaveToFile(Filename, Encoding);
  finally
    Encoding.Free;
  end;
end;
Vielleicht könnte man künftig den schlauen Worten dann aber auch selbst Taten folgen lassen.

himitsu 29. Feb 2012 14:12

AW: 1-Byte-Char in BDS2010
 
PS: LoadFromFile kennt noch einen Encoding-Parameter, welchen man vielleicht sogar verwenden könnte.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:28 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