![]() |
Delphi-Version: 5
ANSISTRING unter Linux verfügbar ???
wir verwenden in einer Unit den Datentyp ANSISTRING,
die Unit System ist eingebunden, allerdings will der compiler ANSISTRING nicht finden.... was mache ich falsch ? |
AW: ANSISTRING unter Linux verfügbar ???
AnsiString gibt es dort nicht, nein. Was es soweit ich mich erinnere gibt ist RawByteString.
Bist du sicher, dass du dort so etwas brauchst? |
AW: ANSISTRING unter Linux verfügbar ???
|
AW: ANSISTRING unter Linux verfügbar ???
Was geht ist:
Delphi-Quellcode:
Var UniString : String;
U8String : UTF8String; Raw : RawByteString; |
AW: ANSISTRING unter Linux verfügbar ???
RawByteString und UTF8String sind doch auch AnsiStrings. :gruebel:
Gingen im NextGen eigentlich die ShortStrings auch nicht? (
Delphi-Quellcode:
und
ShortString
Delphi-Quellcode:
)
String[123]
Was aber immer gehen sollte, ist TEncoding und als TBytes (darin die Chars des ANSI) |
AW: ANSISTRING unter Linux verfügbar ???
![]() Zitat:
|
AW: ANSISTRING unter Linux verfügbar ???
Delphi-Quellcode:
type AnsiStringCrossPlatform = {$ifdef MSWINDOWS} ANsistring {$endif } {$ifdef LINUC} RawByteString {$endif }
also muss ich sowas kodiere, gibt's was besseres ? |
AW: ANSISTRING unter Linux verfügbar ???
Zitat:
|
AW: ANSISTRING unter Linux verfügbar ???
Zitat:
|
AW: ANSISTRING unter Linux verfügbar ???
Zitat:
1. gibt es RawByteString auch unter Windows und 2. ist RawByteString = PChar und 3. musst du diese deswegen stets unterschiedlich behandeln Somit würde dir so etwas nichts an Aufwand einsparen, sondern deinen Code nur länger und unübersichtlicher machen. |
AW: ANSISTRING unter Linux verfügbar ???
Zitat:
Ich bin aber überzeugt, daß es bessere und vor allem stabilere Lösungen gibt. |
AW: ANSISTRING unter Linux verfügbar ???
Zitat:
Zitat:
Gruß K-H |
AW: ANSISTRING unter Linux verfügbar ???
Zitat:
Ps: Ich will damit sagen, nur weil beides reinpasst bedeutet das nicht das beides funktioniert. |
AW: ANSISTRING unter Linux verfügbar ???
Nein. Das bedeutet, dass es solange er keine OS-Funktionen aufruft, egal ist wie das OS Strings verwaltet. Er interpretiert den Speicherinhalt als eine Zeichenkette, in der jedes Zeichen 1 Byte belegt.
|
AW: ANSISTRING unter Linux verfügbar ???
Zitat:
UTF8String ist ein AnsiString mit UTF-8 als CodePage (CP_UTF8) Ich glaub es gab noch einen vordefinierten AnsiString mit CP_OEM, welchen man für Consolenanwendungen verwenden würde. Und AnsiString ist halt ein AnsiString mit der aktuellen System-CodePage (ANSI). Darum wäre ich auch davon ausgegangen, dass es unter NextGen den RawByteString ebenfalls nicht gibt. Nicht RawByteString ist der Vorfahre sondern der ältere AnsiString, von dem RawByteString abgeleitet wird. |
AW: ANSISTRING unter Linux verfügbar ???
Zitat:
Der Windows-Compiler verarbeitet aber AnsiString anders als RawByteString, auch wenn man keine OS-Funktionen aufruft. Eine Umstellung von AnsiString nach RawByteString kann also ein anderes Verhalten auslösen, erstmal unabhängig vom Zielsystem. Wenn dann aber über IFDEF unter Windows AnsiString und unter Linux RawByteString verwendet wird, hat man dieses unterschiedliche Verhalten eben abhängig vom Zielsystem, was zumindest die Fehlersuche erschweren könnte. Da wir immer noch nicht wissen, wie aktuell die AnsiStrings unter Windows eingesetzt werden, kann man auch keine Aussage darüber treffen, ob RawByteString ein funktionaler Ersatz sein kann. |
AW: ANSISTRING unter Linux verfügbar ???
Meine Antwort bezog sich auf KodeZwergs Antwort.
|
AW: ANSISTRING unter Linux verfügbar ???
Uwe hat schon irgendwie Verstanden wie ich es meinte, solange nichts vom TE kommt geb ich euch allen Recht, ich lag falsch und halte mich hier raus.
|
AW: ANSISTRING unter Linux verfügbar ???
hier weitere Informationen zur Verwendung :
Ansistring wird in einigen DLLs verwendet um Daten von C++ , Matlab und Delphi auszutauschen , im reinen Delphi Kernprogramm in Funktionen wie im Beispiel
Delphi-Quellcode:
Ziel OS : entweder Windows x64 oder UBUNTU x64 , vermutlich sind die Daten meistens ASCII ...FS: TFileStream; SaveString: Ansistring; begin FS := TFileStream.Create(FileName, fmCreate); try if SaveString <> '' then FS.Write(Pointer(SaveString)^, Length(SaveString) * SizeOf(AnsiChar)); finally FS.Free; end; ist diese Variante für Cross PLatform Daten typen klarer oder eher undurchsichtig ?
Delphi-Quellcode:
type AnsiString = {$ifdef MSWINDOWS} Ansistring {$endif } {$ifdef LINUX} RawByteString {$endif } |
AW: ANSISTRING unter Linux verfügbar ???
Zitat:
AnsiString setzt immer auch ein Encoding voraus. Wenn man das nicht kennt, kann man die Bedeutung des Inhalts manchmal nur erraten. Bei AnsiString kann man die zu verwendende CodePage angeben, wie z.B. hier:
Delphi-Quellcode:
Bei einer (auch impliziten) Zuweisung string <-> AnsiString wird diese CodePage für die Umwandlung verwendet. Damit werden dann Zuweisungen dieser Art vollkommen transparent vom Compiler erledigt:
const
cEBCDICCodePage = 1141; type EBCDICString = type AnsiString(cEBCDICCodePage);
Delphi-Quellcode:
Fehlt die Angabe einer CodePage (z.B. bei Deklaration als AnsiString) wird die aktuelle CodePage von Windows genommen. Ohne Windows gibt es diesen Default aber nicht. Womöglich ein Grund für das Fehlen von AnsiString bei diesen Compilern.
var
myString: string; myEBCDIC: EBCDICString; begin myString := 'Hallo Welt'; // Unicode myEBCDIC := myString; // Unicode -> EBCDIC myEBCDIC := 'Hallo Welt'; // Unicode -> EBCDIC myString := myEBCDIC; // EBCDIC -> Unicode end; Sollten Umwandlungen nicht vorkommen (was eventuell gar nicht so einfach herauszufinden ist), kann vielleicht alternativ RawByteString verwendet werden. In jedem Fall geht aber TBytes und bei der Umwandlung dann TEncoding verwenden. RawByteString ist also nur für einen Teil der Anwendungsmöglichkeiten geeignet, während TBytes immer geht. Daher würde ich TBytes den Vorzug geben. |
AW: ANSISTRING unter Linux verfügbar ???
Zitat:
Das riecht geradezu nach einem ![]() |
AW: ANSISTRING unter Linux verfügbar ???
Nicht das ich mit Ansi unter Linux was machen möchte, aber
Schonmal ![]() |
AW: ANSISTRING unter Linux verfügbar ???
Zitat:
UTF-8 ist im Prinzip auch nur ANSI, bzw. ein MultyByteCharset mit der Codepage 65001 und selbst Unicode ist ein MultyByteCharset mit fester Länge und der Codepage 1200, bzw. Big Endian mit der Codepage 1201. Wie gesagt, man kann alles irgendwie selber machen, aber nativ und ohne große Umstände gibt es halt nur noch Unicode oder eben TEncoding. Dazu dann noch TStringStream, TStringList, IOUtils.TFile (ReadAllLines, ReadAllText, WriteAllLines, WriteAllText). |
AW: ANSISTRING unter Linux verfügbar ???
Zitat:
Aber im Ernst: Ja klar mache ich auch noch von Zeit zu Zeit mit 8-Bit Chars rum, und ich nutze auch UTF-8 dafür, im Single-Byte-Modus. Z.B. wenn ich Daten von kleinen Microcontrollern gesendet bekomme, oder aus alten DB. Trotzdem achte ich bei neuen Strukturen auf UTF-8 (echte Unicodefähigkeit) wo immer möglich, und werfe Altes über Bord. Das gilt dann auch für Linux. Rollo |
AW: ANSISTRING unter Linux verfügbar ???
Gerade bei Dateien/Stream gibt es bei Multiplatform gern paar kleinere Problemchen.
z.B. nutzen im Windows viele Programme ANSI als Default, wenn eine Textdatei keinen BOM hat, während im MacOS die selben Dateien aber per Default als UTF-8 behandelt werden wollen. In Linux/Mac speicherst du UTF-8 und im Windows wird das als ANSI mit "komischen" Umlauten ausgelesen. :stupid: |
AW: ANSISTRING unter Linux verfügbar ???
@Uwe
also so dann :
Delphi-Quellcode:
{$ifdef MSWINDOWS}
/// AnsiString = AnsiString ... eh schon da {$endif } {$ifdef LINUX} type AnsiString = TBytes; {$endif } |
AW: ANSISTRING unter Linux verfügbar ???
Warum benutzt du denn nicht einfach überall TBytes? Wenn du von Datenaustausch sprichst, hört sich das so nach Missbrauch von AnsiString als Datencontainer an.
|
AW: ANSISTRING unter Linux verfügbar ???
Zitat:
|
AW: ANSISTRING unter Linux verfügbar ???
Zitat:
Wobei die älteren Delphis TBytes leider nicht zur Verfügung stellen. Gruß K-H |
AW: ANSISTRING unter Linux verfügbar ???
Zitat:
Aber nen Array of Byte |
AW: ANSISTRING unter Linux verfügbar ???
Zitat:
|
AW: ANSISTRING unter Linux verfügbar ???
Zitat:
Warum sollte man dann auf einer Plattform sauber mit TBytes arbeiten und auf der anderen (vermutlich noch mit IFDEFs gewürzt) bei einem unpassenden AnsiString-Container bleiben? |
AW: ANSISTRING unter Linux verfügbar ???
Zitat:
|
AW: ANSISTRING unter Linux verfügbar ???
Zitat:
|
AW: ANSISTRING unter Linux verfügbar ???
Z.B. für Konvertierungsaufgaben wäre es ganz schön gewesen.
Aber wer die alten Delphis noch in Betrieb hat wird die Klippen wohl kennen. Gruß K-H |
AW: ANSISTRING unter Linux verfügbar ???
wenn ich Ansistring jetzt durch TBtyes für LINUX ersetzen lässt sich diese Zeile nicht mehr kompilieren
Delphi-Quellcode:
if SaveString <> '' then
FS.Write(Pointer(SaveString)^, Length(SaveString) * SizeOf(AnsiChar)); wie lautet hier die Lösung um unter beiden Plattformen mit einer CodeVariante auszukommen ? Geht es ohne weitere
Delphi-Quellcode:
$Ifdef
|
AW: ANSISTRING unter Linux verfügbar ???
Zitat:
Das ist ja was ich geschrieben hatte... es macht keinen Sinn mit IFDEF verschiedene Typen zu nutzen. Denn du musst den Code ohnehin für TBytes anpassen und hast dann sauberen Code. Da macht es doch keinen Sinn per IFDEF unter Windows wieder auf unsauberen Code umzuschalten... Beides unter einen Hut bekommen funktioniert nicht, weil TBytes nullbasiert ist, AnsiStrings aber 1-basiert. Ansonsten könnte man die Adresse des ersten Elements benutzen statt auf Pointer zu casten. |
AW: ANSISTRING unter Linux verfügbar ???
Zitat:
Delphi-Quellcode:
So vielleicht? In der Hoffnung es gibt mit Linux auch TBytesStream?
procedure SaveBytesToFile(const Data: TBytes; const FileName: string);
var stream: TBytesStream; begin stream := TBytesStream.Create(Data); try stream.SaveToFile(FileName); finally stream.Free; end; end; |
AW: ANSISTRING unter Linux verfügbar ???
Als ich vor ein paar Jahren Synapse Android und iOS tauglich machen wollte, habe ich auch Rotz und Wasser geschwitzt. Da ist an allen Ecken und Enden mit Ansistring hantiert wurden und TMarshal.AsAnsi bzw. MarshaledAString schied für aus.
Vielleicht hilft dir ja meine damals verwendete Lösung: ![]() Dabei fällt mir auf, dass ich teilweise noch "fehlerhafte" Fragmente wie:
Code:
drin habe. Das sollte ich mal bei Gelegenheit noch anpassen.
Stream.Write(MarshaledAString(TMarshal.AsAnsi(Value))^, Length(Value));
{$ELSE} Stream.Write(PAnsiChar(Value)^, Length(Value)); Christian |
AW: ANSISTRING unter Linux verfügbar ???
Wie jaenicke es schon sagte, mach es so, wie es überall funktioniert und schmeiß alles Andere raus.
Zitat:
und da es immer 1 ist, kann man es natürlich auch weglassen.
Delphi-Quellcode:
ergibt das Selbe, ist aber nunmal sinnlos.
SizeOf(Byte)
Und warum es beim IF mit dem Array nicht geht, sollte klar sein, was man auch über Length lösen könnte, oder man lässt es einfach weg und schreibt dann halt auch die 0 Bytes. Nja, bezüglich TBytes würde ich dann natürlich auch die Überladung für TBytes verwenden, welches der TStream schon länger besitzt. Und wie gesagt, es gibt alternativen wie TFile.WriteAll* und TStringStraem, mit denen man sich garnicht um die Straem-Behandlung kümmern muß. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:06 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