Socke hat geschrieben:Michl hat geschrieben:Ein UTF8String ist ein mit Codepage versehener String.
Genau das möchte ich doch erreichen!
Ich habe ein falsches Wort verwendet. Besser wäre gewesen ein UTF8String ist ein mit der Codepage CP_UTF8 vorbelegter String.
Socke hat geschrieben:Wo soll den der Unterschied zwischen UTF8String und einem anderen String mit CP_UTF8 liegen? CP_ACP ist für mich genau so eine CodePage wie UTF-8, nur dass sie weniger spezifiziert ist als UTF-8 (abhängig vom jeweiligen System).
Es wäre schön, wenn du diesen genannten Bugreport nochmals heraussuchen und hier verlinken könntest. Vielleicht verstehe ich dann mehr von den Hintergründen.
Kann sein, dass ich das irgendwo anders gelesen habe und nicht im Bugtracker. Finde ich leider nicht mehr. Bekannt ist das Verhalten allerdings bei FPC, siehe z.B. Testprogramm von Jonas Maebe:
http://bugs.freepascal.org/view.php?id=29170#c87948.
Immer wieder wird auf die Seite
http://wiki.freepascal.org/FPC_Unicode_support verwiesen. Allerdings ist hier (
http://wiki.freepascal.org/FPC_Unicode_ ... _code_page) ja von einer statischen Codepage die Rede.
Ich selber weiß, dass ich immer nur "String" und nicht "AnsiString" oder "UTF8String" verwenden muss, da sich "AnsiString" und "UTF8String" bei der weiteren Verwendung wie normale Strings verhalten:
Code: Alles auswählen
program Project1;
{$codepage utf8}
uses sysutils;
const
cp1252ae = #$E4;
var
us: UTF8String;
s: String;
rs: RawByteString;
function PStringToHex(P: Pointer; Cnt: Integer): String;
var
i: Integer;
begin
Result := '';
for i := 1 to Cnt do begin
Result := Result + IntToHex(PByte(P)^, 2) + ' ';
inc(p);
end;
end;
begin
s := 'ä';
WriteLn(StringCodePage(s), ': ', PStringToHex(Pointer(s), Length(s)));
us := s;
WriteLn(StringCodePage(us), ': ', PStringToHex(Pointer(us), Length(us)));
rs := cp1252ae;
SetCodePage(rs, 1252, False);
WriteLn(StringCodePage(rs), ': ', PStringToHex(Pointer(rs), Length(rs)));
us := rs;
WriteLn(StringCodePage(us), ': ', PStringToHex(Pointer(us), Length(us)));
SetCodePage(RawByteString(us), CP_UTF8, True);
WriteLn(StringCodePage(us), ': ', PStringToHex(Pointer(us), Length(us)));
ReadLn;
end.
Die Ausgabe ist:
Code: Alles auswählen
65001: C3 A4
65001: C3 A4
1252: E4
1252: E4
65001: C3 A4
So, wie ich es erwartet hatte.
Ich kann nicht einschätzen, ob dieses Verhalten genau so von FPC gewünscht ist (bekannt ist es). Dann müsste man den Abschnitt im Wiki
http://wiki.freepascal.org/FPC_Unicode_ ... _code_page überarbeiten. Sollten die Codepages wirklich statisch sein, wäre wohl ein Bugreport sinnvoll.
[Edit] Sehe gerade, du hattest einen gemacht
http://bugs.freepascal.org/view.php?id=29622. Ja, scheint so, das Wiki müsste wohl angepasst werden, evtl. sollte man vorher nochmal in der FPC Mailinglist nachfragen, ob sie tatsächlich keine statischen Codepages wollen.