A
Stephan schrieb:
Wenn ich dies richtig verstehe, kann ich unter BCB6 eine lib erstellen welche intern den "alten" AnsiString verwendet, nur die Parameter sollten von AnsiString auf char* umgestellt werden.
Ja.
Stephan schrieb:
Kann mir eventuell jemand etwas zu den Warnings sagen, habe von Delphi leider keine Ahnung.
(Das würde ich dringend ändern. Delphi-Kenntnis ist für C++Builder-Programmierer von entscheidendem Vorteil.)
Stephan schrieb:
[DCC Warnung] iduri_V8.pas(58): W1050 WideChar in Set-Ausdrücken auf ByteChar verkürzt. Ziehen Sie die Verwendung der Funktion 'CharInSet' aus der Unit 'SysUtils' in Betracht.
Was ein Set ist, dürfte dir aus C++Builder bekannt sein. In Delphi ist das ein intrinsischer Typ, z.B.:
type
TOrdinal = (One, Two, Three);
TOrdinals = set of TOrdinal;
const
SomeOrdinals: TOrdinals = [One, Three];
Aber auch:
type
TSysCharSet = set of AnsiChar;
const
AlphaNumericChars: TSysCharSet = ['A'..'Z', 'a'..'z', '0'..'9', '_'];
WhitespaceChars = [' ', #09];
Wie im letzten Beispiel ersichtlich, kann die explizite Typangabe auch weggelassen werden; der Compiler deduziert den Typen dann anhand der Elementtypen.
Hier liegt nun das Problem: seit Delphi 2009 sind Char-Literale wie ' ' und #09 nicht mehr AnsiChars, sondern WideChars. Nun enthält ein Set für jeden möglichen Wert des darunterliegenden Typen ein Flag-Bit. TOrdinals benötigt also drei Bits, TSysCharSet 256 Bits = 32 Bytes. Ein WideChar-Set jedoch wären 65536 Bits = 8 KB groß, und da das in den meisten Fällen unerwünscht ist, konvertiert der Delphi-Compiler diese Sets unter besagter Warnung zu AnsiChar-Sets.
Stephan schrieb:
[DCC Warnung] idglobal_V8.pas(988): W1058 Implizite String-Umwandlung mit potenziellem Datenverlust von 'string' zu 'ShortString'
[...]
[DCC Warnung] idglobal_V8.pas(991): W1057 Implizite String-Umwandlung von 'ShortString' zu 'string'
String[n] entspricht SmallString<n> und ist ein auf n AnsiChars begrenzter String. Die anderen Strings, die du benutzt, basieren nun aber auf WideChar, weshalb implizite Konvertierungen stattfinden.
Die URLDecode()-Funktion unterstützt allerdings Unicode-Codierungen nicht richtig; du könntest einfach die entsprechende Funktion aus Indy 10 ausleihen:
// IdURI.pas, l. 302ff:
class function TIdURI.URLDecode(ASrc: string): string;
var
i: Integer;
ESC: string;
CharCode: Integer;
begin
Result := ''; {Do not Localize}
// S.G. 27/11/2002: Spaces is NOT to be encoded as "+".
// S.G. 27/11/2002: "+" is a field separator in query parameter, space is...
// S.G. 27/11/2002: well, a space
// ASrc := StringReplace(ASrc, '+', ' ', [rfReplaceAll]); {do not localize}
i := 1;
while i <= Length(ASrc) do begin
if ASrc[i] <> '%' then begin {do not localize}
Result := Result + ASrc[i]; // Copy the char
Inc(i); // Then skip it
end else begin
Inc(i); // skip the % char
if not CharIsInSet(ASrc, i, 'uU') then begin {do not localize}
// simple ESC char
ESC := Copy(ASrc, i, 2); // Copy the escape code
Inc(i, 2); // Then skip it.
try
CharCode := IndyStrToInt('$' + ESC); {do not localize}
Result := Result + Char(CharCode);
except end;
end else
begin
// unicode ESC code
// RLebeau 5/10/2006: under Win32, the character will end
// up as '?' in the Result when converted from Unicode to Ansi,
// but at least the URL will be parsed properly
ESC := Copy(ASrc, i+1, 4); // Copy the escape code
Inc(i, 5); // Then skip it.
try
CharCode := IndyStrToInt('$' + ESC); {do not localize}
Result := Result + {$IFDEF UNICODESTRING}Char{$ELSE}WideChar{$ENDIF}(CharCode);
except end;
end;
end;
end;
end;