Zitat von
PAX:
das problem is, ich schreibe in eine datei vom typ record. also praktisch mit diesen parametern:
Delphi-Quellcode:
type Vocable = record
Vlinks,Vrechts: string[255];
end;
Den ShortString / String[...] gib es ja nur für SingleByteStrings (
Ansi und Co.)
Bei WideString könnte man höchstens einen Array verwenden.
(diese Variante hatte ich ja oben auch noch vergessen -.-'')
Delphi-Quellcode:
type Vocable = record
Vlinks, Vrechts: array[1..255] of WideChar;
end;
Und dort dann muß man dann nur die Strings rein-/rauskopieren
Ob der Compiler auch bei WindeStrings eine automatische Konvertierung vornimmt, weiß ich jetzt garnicht, also ob Nachfolgendes gleich möglich ist:
Delphi-Quellcode:
Var V: Vocable;
S: WideString;
V.Vlinks := S;
S := V.Vlinks;
Wenn nicht, dann muß man es halt selber machen.
z.B. zum reinkopieren:
Delphi-Quellcode:
MemCopy(@V.Vlinks[1], S[1], Length(S) * 2 + 2);
// natürlich nur, wenn der String (nach der obrigen Definition von Vocable) nicht länger als 254 Zeichen ist
Zitat von
PAX:
bei der variante mit der zeigerspielerei hab ich nicht verstanden, warum die länge mit 2 multipliziert werden muss. und des weiteren müssen mehrere widestrings darin gespeichert werden, quasi anfang und ende eines jeden strings müssen irgendwie klar sein. vielleicht könnte man immer grundsätzlich eine feste länge der zeichenkette schreiben und den rest ggf. mit leerzeichen auffüllen?
Also bei den obrigen Beispielen (außer bei der Variante "nur ein String in der Datei") ist ja überall die Länge vorgegeben ... entweder wird die Längenangabe mit gespeichert, oder der String ist per #0 abgeschlossen.
Zitat von
PAX:
bei der 2. möglichkeit hab ich mal geguckt und musste feststellen, dass ich die funktion widetoutf8 nicht habe. es gibt aber konvertierungsfunktionen zwischen
ansi und utf8, und
unicode (is das nich widestring?) und utf8. das hat aber nich hingehauen und bei unicodetoutf8 seh ich nicht durch.
Unicode ist in diesem Fall WideString (oder besser gesagt wohl eher PWideChar).
Eigendlich steht
Unicode ja für das Gesamte Zeichensystem, also für die 1-, 2- und 4-ByteZeichen, aber oftmals wird der Name halt nur für die 2-Byte-Zeichen/-Strings verwendet -.-''
Also UnicodeToUtf8 / Utf8ToUnicode sind die Richtigen, für meine obrigen Beispiele.
Als Umsetzung wäre z.B. folgendes möglich:
(Ich hoffe mal es funktioniert so, ansonsten muß sich mal hier wer zu Wort melden, der die Definitionen der Befehle kennt ... konnte auf die Schnelle nur die Parameterliste bekommen und hab mir den Rest vor mir bekannten Funktionen zusammengereimt)
Delphi-Quellcode:
WideToUTF8(W, A);
i := UnicodeToUtf8(nil, @W[1], MaxInt);
SetLength(A, i);
UnicodeToUtf8(@A[1], @W[1], i);
Delphi-Quellcode:
UTF8ToWide(A, W);
i := Utf8ToUnicode(nil, @A[1], MaxInt);
SetLength(W, i);
Utf8ToUnicode(@W[1], @A[1], i);
Zitat von
PAX:
aber theoretisch sollte das funktionieren, wenn ich widetoansi anwende? also wenn ich kyrillische buchstaben in der tntkomponente habe und diese konvertiere, in datei speichere und sie wieder auslese und zurücklade in die komponente (vorher wieder ansitowide), dann steht dort exakt das selbe wie zuvor?
Bei WideToAnsi werden die 2-Byte-Zeichen direkt in 1-Byte-Zeichen umgewandelt, wodurch also ein Informationsverlust eintritt - alle Zeichen (Wide), welche sich nicht mit nur einem Byte (
Ansi, oder jehr nach verwendetem Zeichensatz) darstellen lassen, werden durch eine Ersatzzeichen (oftmals das Fragezeichen, wobei es ja eigentlich das #$A1 und für LongToWide das #$FFFD gibt) ersetzt.
Zitat von
PAX:
ich hab gerade keine befehlsliste zur hand, aber das dritte argument bei write is doch die anzahl der zu schreibenden zeichen, gell? warum muss hier mal 2 multipliziert werden?
Wie gesagt, sie das mal nicht ganz als richtige Befehle an, denn man kann das Ganze ja auf verschiedene Weise lösen (so z.B. auch per Streams)
Code:
Operation(Datei-
Handle/-Variable, Zeiger auf Speicherbereich, zu bearbeitente Bytes);
Und die Multiplication mit 2 kommt dfaher, weil hier ja je Zeichen 2 Byte vorliegen, also
Byte = Zeichen * 2.
Zitat von
PAX:
bei der 2. möglichkeit hab ich mal geguckt und musste feststellen, dass ich die funktion widetoutf8 nicht habe.
Wie gesagt, das sind sozusagen nur Pseudonamen, sie sollen also nir vermitteln, was gemacht werden muß (hab ja derzeit kein Delphi und auch nicht unbedingt die Zeit im Netz nach den genauen Bezeichnungen zu suchen)