![]() |
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 |
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: |
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 |
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 |
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.
|
AW: 1-Byte-Char in RAD2010
Danke.
Die Satzlänge ist leider 361 Zeichen. |
AW: 1-Byte-Char in RAD2010
Zitat:
|
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).
|
AW: 1-Byte-Char in BDS2010
Einen Ansistring einlesen geht erst mal.
Dummerweise ist die Datei CP850 kodiert. |
AW: 1-Byte-Char in BDS2010
Hilft Dir
![]() [edit] Oder wohl besser ![]() |
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 |
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.
![]() ![]() ![]() ![]() ![]() Es gibt sogar ein
Delphi-Quellcode:
, wobei ich nicht genau weiß, wie man das nutzt.
ReadLString(var t: TTextRec; var s: AnsiString; CodePage: Word);
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-Quellcode:
type
UTF8String = type AnsiString(65001); OEMString = type AnsiString(850); // oder = type AnsiString(CP_OEMCP) |
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 |
AW: 1-Byte-Char in BDS2010
@Bummi: wieso in Gottes Namen übergibst Du die Listen als Variablenparameter?
|
AW: 1-Byte-Char in BDS2010
@Deddy
war ein nicht endbereinigter Code, bei dem Ursprünglich wenn nicht assigned Stringlisten erzeugt wurden |
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 ;)
|
AW: 1-Byte-Char in BDS2010
Zitat:
|
AW: 1-Byte-Char in BDS2010
Class Helper für welche Klasse?
|
AW: 1-Byte-Char in BDS2010
Zitat:
|
AW: 1-Byte-Char in BDS2010
Wenn es sonst niemand macht:
Delphi-Quellcode:
Vielleicht könnte man künftig den schlauen Worten dann aber auch selbst Taten folgen lassen.
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; |
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 17:17 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-2025 by Thomas Breitkreuz