本文整理自网络,侵删。
QString 新增了 UrlEncode 函数,优化了性能,速度比官方的版本快一点,更重要的是可以ANSI和UTF8编码,或者是自己喜欢的编码都行。
function UrlEncode(const ABytes: PByte; l: Integer; ASpacesAsPlus: Boolean)
: QStringW; overload;
function UrlEncode(const ABytes: TBytes; ASpacesAsPlus: Boolean)
: QStringW; overload;
function UrlEncode(const S: QStringW; ASpacesAsPlus: Boolean;
AUtf8Encode: Boolean = True): QStringW; overload;
function UrlEncode(const ABytes: PByte; l: Integer; ASpacesAsPlus: Boolean)
: QStringW; overload;
function UrlEncode(const ABytes: TBytes; ASpacesAsPlus: Boolean)
: QStringW; overload;
function UrlEncode(const S: QStringW; ASpacesAsPlus: Boolean;
AUtf8Encode: Boolean = True): QStringW; overload;
三个重载,前两个方便使用自定义的编码的,第三个重载如果不使用UTF-8编码,就使用 ANSI 编码来处理。
实际上这个代码是直接改的系统的TURI.EncodeUrl,只是将默认的UTF-8编码更换为了Ansi
function AnsiURLEncode(const AValue: string; SpacesAsPlus: Boolean): string;
function IsHexChar(C: Byte): Boolean;
begin
case Char(C) of
'0' .. '9', 'a' .. 'f', 'A' .. 'F':
Result := True;
else
Result := False;
end;
end;
// from http://www.faqs.org/rfcs/rfc3986.html
// URL safe chars = ['A' .. 'Z', 'a' .. 'z', '0' .. '9', '-', '_', '.', '~'];
const
URLSafeCharMatrix: array [33 .. 127] of Boolean = (False, False, False, False,
False, False, False, False, False, False, False, False, True, True, False,
True, True, True, True, True, True, True, True, True, True, False, False,
False, False, False, False, False, True, True, True, True, True, True, True,
True, True, True, True, True, True, True, True, True, True, True, True,
True, True, True, True, True, True, True, False, False, False, False, True,
False, True, True, True, True, True, True, True, True, True, True, True,
True, True, True, True, True, True, True, True, True, True, True, True,
True, True, True, False, False, False, True, False);
XD: array [0 .. 15] of Char = ('0', '1', '2', '3', '4', '5', '6', '7', '8',
'9', 'A', 'B', 'C', 'D', 'E', 'F');
var
Buff: TBytes;
I: Integer;
begin
Buff := TEncoding.ANSI.GetBytes(AValue);
Result := '';
I := 0;
while I < Length(Buff) do
begin
if (I + 2 < Length(Buff)) and (Buff[I] = Ord('%')) then
if IsHexChar(Buff[I + 1]) and IsHexChar(Buff[I + 2]) then
begin
Result := Result + '%' + Char(Buff[I + 1]) + Char(Buff[I + 2]);
Inc(I, 3);
Continue;
end;
if (Buff[I] = Ord(' ')) and SpacesAsPlus then
Result := Result + '+'
else
begin
if (Buff[I] >= 33) and (Buff[I] <= 127) then
begin
if URLSafeCharMatrix[Buff[I]] then
Result := Result + Char(Buff[I])
else
Result := Result + '%' + XD[(Buff[I] shr 4) and $0F] +
XD[Buff[I] and $0F];
end
else
Result := Result + '%' + XD[(Buff[I] shr 4) and $0F] +
XD[Buff[I] and $0F];
end;
Inc(I);
end;
end;
相关阅读 >>
Delphi twebbrowser 响应回车键(ewb响应正常,无需额外代码)
更多相关阅读请进入《Delphi》频道 >>