Es liegen 2 Kodierungen nacheinander vor.
Als erstes wird ein WideString (16bit pro Zeichen) mit UTF-8 codiert.
Das Ergebnis ist ein multibyte-String, der sich aber problemlos in einen AnsiString (8bit) darstellen lässt.
Nun wird dieser String "URLcodiert"; d.h. nichtdarstellbare Zeichen wie z.B. ?, %, / werden
durch %XX kodiert.
Und rückwärts geht's so:
Zuerst "URLdecodieren" und dann UTF-8 nach WideString.
Delphi-Quellcode:
// bei Benutzung von INDY
function URLEncode(Txt: AnsiString): AnsiString;
begin
Result := TIdURI.ParamsEncode(Txt);
end;
function URLDecode(Txt: AnsiString): AnsiString;
begin
Result := TIdURI.URLDecode(Txt);
end;
Delphi-Quellcode:
function StringToWideStringEx(const S: string; CodePage: Word): WideString;
var
InputLength,
OutputLength: Integer;
begin
InputLength := Length(S);
OutputLength := MultiByteToWideChar(CodePage, 0, PChar(S), InputLength, nil, 0);
SetLength(Result, OutputLength);
MultiByteToWideChar(CodePage, 0, PChar(S), InputLength, PWideChar(Result), OutputLength);
end;
function WideStringToStringEx(const WS: WideString; CodePage: Word): string;
var
InputLength,
OutputLength: Integer;
begin
InputLength := Length(WS);
OutputLength := WideCharToMultiByte(CodePage, 0, PWideChar(WS), InputLength, nil, 0, nil, nil);
SetLength(Result, OutputLength);
WideCharToMultiByte(CodePage, 0, PWideChar(WS), InputLength, PChar(Result), OutputLength, nil, nil);
end;
function UTF8ToWideString(const S: string): WideString;
begin
Result := StringToWideStringEx(S, CP_UTF8);
end;
function WideStringToUTF8(const WS: WideString): string;
begin
Result := WideStringToStringEx(WS, CP_UTF8);
end;