Arg, beim Test hab ich jetzt noch festgestellt, daß die Typeninfos von einem String auf einen Anderen übertragen werden können
(das macht überhaupt keinen Spaß
)
z.B. würde man hinter R (also dem UTF8-String genannt "R(UTF)") auch UTF8-kodierte Zeichen vermuten/erwarten
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
type
PStrRec = ^StrRec;
StrRec = packed record
codePage: Word;
elemSize: Word;
refCnt: Longint;
length: Longint;
end;
type
TMyString = type AnsiString(28597); // ISO-8859-7 aka CodePage:28597
var
R: RawByteString;
A: AnsiString;
M: TMyString;
S1, S2, S3, S4, S5: String;
begin
R := UTF8Encode('ÈÒú');
A := 'ÈÒú';
//M := 'ÈÒú';
//M := #200#210#250;
SetLength(M, 3); M[1] := #200; M[2] := #210; M[3] := #250;
S1 := R;
S2 := A;
S3 := M;
UniqueString(AnsiString(R));
PStrRec(Integer(R) - SizeOf(StrRec)).codePage := CP_NONE;
UniqueString(AnsiString(M));
PStrRec(Integer(M) - SizeOf(StrRec)).codePage := CP_NONE;
S4 := R;
S5 := M;
ShowMessage(Format('R(UTF) = %s'#10'A = %s'#10'M(ISO) = %s'#10
+ 'R = %s'#10'M = %s', [S1, S2, S3, S4, S5]));
end;
Vielleicht erkennt man auch, was man für einen Aufwand hat, wenn man sich selber um die Kodierung oder Nicht-Kodierung kümmern möchte.
Gut, dafür kann man diese Automatik auch ausnutzen
früher (vor D2009) sah es so aus
Delphi-Quellcode:
Var S: WideString;
D:
{Ansi}String;
D := UTF8Encode(S);
jetzt (ab D2009) sieht es so aus
Delphi-Quellcode:
Var S: (
Unicode)
String;
D: UTF8String;
D := S;
eigentlich würden hier ja die "asiatischen" Schriftzeichen nicht überleben:
Delphi-Quellcode:
var U:
String;
// ist ein Unicode-String
A: UTF8String;
// ist intern nur ein AnsiString
U := #23456#34567#45678;
A := U;
ShowMessage(A);