mschnell hat geschrieben:Wenn Du spezielle utf-16 Funktionen einbauen willst (die möglicherweise den Datentyp widestring zum Speichern der Information verwenden), brauchst Du natürlich einen Konverter utf8utf16utf32. Das sollte relativ einfach gehen, weil keine Tabellen benötigt werden sondern ein Algorithmus, der sich aus der Unicode Definition ergibt
Könntest du so etwas bauen? Das wär super. Dieser Thread ist für mich (nahezu) der erste Kontakt mit Unicode, daher würde ich das ungern selbst machen.
mschnell hat geschrieben:Die Anzahl der "sichtbaren" Zeichen sollte doch für alle Codierungen gleich sein. Da reicht doch eine Funktion ????
(Ich vermute "??Count" ist die Anzahl der gleichgroßen Elemente, die je nach Zeichen unterschiedlich sein kann)
Hm, du hast Recht. Welche Codierung intern vorliegt, muss sowieso automatisch geregelt werden. Das trifft auf Length und auf Count zu.
mschnell hat geschrieben:Ist natürlich richtig, wenn man "konvertieren" als "verlustfrei konvertieren" interpretiert.
Genau das tue ich nicht. Man braucht also desweiteren folgende Funktion:
Code: Alles auswählen
...
function AnsiSuitable(ACodePage): Boolean; // wie schon in der letzten Version
function UCS2Suitable: Boolean; // Test, ob Umwandlung in UCS2 verlustfrei möglich ist
UTF-8, UTF-16, UTF-32 und UCS-4 können ja sowieso alle Zeichen darstellen (wenn man den eventuellen Unterschied zw. UTF-32 und UCS-4 vernachlässigt).
theo hat geschrieben:Ich hab mal heute abend mal was gebastelt.
Du speicherst grundsätzlich in UTF-8. Ich würde da eher einen anderen Weg verfolgen. Ich würde grundsätzlich Variablen für die Speicherung in allen unterstützten Formatierungen deklarieren, und diese dann füllen, sobald die Umwandlung in diejenige Formatierung sowieso erfolgen muss. Quasi so:
Code: Alles auswählen
TStr = class(TObject)
private
AnsiStr: AnsiString;
UTF8Str: AnsiString;
UTF16Str: WideString;
UCS4Str: UCS4String;
AnsiStrSet: Boolean; // true, wenn AnsiStr den wahren Wert hat, mit false initialisiert
UTF8StrSet: Boolean; // true, wenn UTF8Str den wahren Wert hat, mit false initialisiert
UTF16StrSet: Boolean; // true, wenn UTF16Str den wahren Wert hat, mit false initialisiert
UCS4StrSet: Boolean; // true, wenn UCS4Str den wahren Wert hat, mit false initialisiert
public
...
Die Implementierung von GetUTF16String würde dann z.B. so aussehen:
Code: Alles auswählen
function TStr.GetUTF16String: WideString;
result := ''; // oder muss result := UTF8Decode(''); ?
if UTF16StrSet then begin
result := UTF16Str;
exit;
end;
if UTF8StrSet then begin
UTF16Str := UTF8Decode(UTF8Str);
UTF16StrSet := true;
result := UTF16Str;
exit;
end;
if UCS4StrSet then begin
UTF16Str := UCS4StringToWideString(UCS4Str);
UTF16StrSet := true;
result := UTF16Str;
exit;
end;
if AnsiStrSet then begin
UTF8Str := AnsiToUTF8(AnsiStr);
UTF8StrSet := true;
UTF16Str := UTF8Decode(UTF8Str);
UTF16StrSet := true;
result := UTF16Str;
exit;
end;
Wenn ein String manipuliert wird (Schreibzugriff auf einen Buchstaben), dann muss jeder bis dahin gesetzte String manipuliert werden, um die Konsistenz zu wahren. Das heißt auch, dass eine Umwandlung immer zumindest die Anzahl der sichtbaren Zeichen wahren muss, aber ich denke, dass das sowieso der Fall ist.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!