Thema: Delphi Unicode in Textfiles...

Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

Re: Unicode in Textfiles...

  Alt 22. Feb 2006, 16:10
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)
$2B or not $2B
  Mit Zitat antworten Zitat