theo hat geschrieben:In Windows gibt es schon seit längerer Zeit Unicode:
"Obwohl man auf der Oberfläche von Windows noch viel mit ASCII bzw. ANSI arbeitet, arbeitet die Windows NT-Reihe (also auch Win2000, WinXP, Win2003) seit der Version 4.0 intern komplett mit Unicode."
http://www.lima-city.de/tutorials/show/1887" onclick="window.open(this.href);return false;
Sehr interessant. Laut
http://en.wikipedia.org/wiki/UTF-16#Use ... vironments" onclick="window.open(this.href);return false; benutzt Windows UTF-16. Jetzt ist mir auch klar, was ihr immer mit WideString wollt

. Danke für die Aufklärung.
theo hat geschrieben:Den Link sehe ich schon, aber den Unterschied erkenne ich nicht. In der weiterführenden Seite heisst es:
UCS-4: Kodierung in 4 Byte (entspricht UTF-32)
Das steht nicht auf der von mir verlinkten Seite, sondern auf
http://de.wikipedia.org/wiki/Universal_Character_Set" onclick="window.open(this.href);return false; (habe ich durch Zufall gefunden).
Auf der von mir verlinkten Seite (
http://de.wikipedia.org/wiki/UTF-32" onclick="window.open(this.href);return false;) steht folgendes: "Im aktuellen Unicode Standard 5.1 ist UTF-32 eine Untermenge von UCS-4." Offenbar hat sich da wohl gerade etwas geändert, oder bei Wiki steht mal wieder Mist.
Andere Überlegung: In der wstringh.inc gibt es lediglich Konvertierungsfunktionen zwischen Ansi UTF-8 WideString UCS-4. Ich hatte eigentlich geplant, diese Funktionen für die Konvertierungen zu benutzen. Laut mse in seinem Beitrag vom 19.10.2008, 12:28 ist WideString UTF-16 codiert:
mse hat geschrieben:ansistring -> widestring, der ansistring wird vom widestringmanager unter Verwendung der aktuellen Systemcodierung in utf-16 gewandelt, unter Linux muss dafür die unit cwstring unter uses aufgeführt werden.
Somit fallen UCS-2 und UTF-32 als Optionen weg, solange keiner eine Konvertierungsfunktion zwischen UCS-2 und UTF-16 findet und den genauen Unterschied zwischen UTF-32 und UCS-4 kennt (falls er nun existiert) oder dafür eine Konvertierungsfunktion findet.
Somit lautet die "aktuelle Version" folgendermaßen (wieder mit neuen Ideen aufgefüllt

):
Code: Alles auswählen
TStr = class(TObject)
...
public
property AnsiString: AnsiString read GetAnsiString write SetAnsiString;
property UTF8String: UTF8String read GetUTF8String write SetUTF8String;
property UTF16String: WideString read GetUTF16String write SetUTF16String;
property UCS4String: UCS4String read GetUCS4String write SetUCS4String;
property AnsiChar[APosition: Cardinal]: Char read GetAnsiChar write SetAnsiChar; // eigentlich unnötig
property UTF8Char[APosition: Cardinal]: UTF8String read GetUTF8Char write SetUTF8Char;
property UTF16Char[APosition: Cardinal]: WideString read GetUTF16Char write SetUTF16Char;
property UCS4Char[APosition: Cardinal]: UCS4Char read GetUCS4Char write SetUCS4Char; // eigentlich unnötig
function AnsiSubStr(AStartPosition, ACharacterCount: Cardinal): AnsiString; // eigentlich unnötig
function UTF8SubStr(AStartPosition, ACharacterCount: Cardinal): UTF8String;
function UTF16SubStr(AStartPosition, ACharacterCount: Cardinal): UTF16String;
function UCS4SubStr(AStartPosition, ACharacterCount: Cardinal): UCS4String; // eigentlich unnötig
function AnsiLength(AStartPosition, ACharacterCount: Cardinal): Cardinal; // eigentlich unnötig
function UTF8Length(AStartPosition, ACharacterCount: Cardinal): Cardinal;
function UTF16Length(AStartPosition, ACharacterCount: Cardinal): Cardinal;
function UCS4Length(AStartPosition, ACharacterCount: Cardinal): Cardinal; // eigentlich unnötig
function AnsiCount: Cardinal; // eigentlich unnötig
function UTF8Count: Cardinal;
function UTF16Count: Cardinal;
function UCS4Count: Cardinal; // eigentlich unnötig
property CodePage: ? read GetCodePage write SetCodePage; // aktuell verwendete Codepage, Voreinstellung ist z.B. die Codepage im System, falls es mit Ansi arbeitet
function Suitable(ACodePage: ?): Boolean // true, wenn der aktuell gespeicherte String mit der übergebenen Codepage komplett dargestellt werden kann.
function GetSuitableCodepages: ?; // Gibt eine Liste aller im System vorhandenen oder sonstwie bekannten Codepages zurück, die den aktuellen String darstellen können
end;
Damit ist nun auch in jedem Fall die Codierung klar. Bei den mit "// eigentlich unnötig" gekennzeichneten properties und Funktionen kann man auch auf althergebrachte Funktionen wie copy() und length() zurückgreifen.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!