unit LibStringEx;
interface
uses
Windows, SysUtils, Graphics,
LibString, LibWideString;
function ToHex(const CH : char): String;
function FromHex(const CH,CL : Char): Char;
procedure CommandParse_URL(URL : String; var CMD, Para : String);
// 가능하면 이걸쓰지말고 HTTPApp 유닛의 HTTPEncode/HTTPDecode를 사용해라.
// 이것들은 URL을 통째로 파라미터로 넣도록 설계되었고,
// HTTPApp의 함수들은 필드별로 따로 인코딩해야한다.
function URLEncode(const Str : String) : String;
function URLDecode(const Str : String) : String;
function WebEncode(const Str : String) : String;
function WebEncodeW(const Str : WideString) : WideString;
function WebColor(const Color: TColor) : String;
function WebEncodeEx(const Str : String; const EncChar: array of Char) : String;
function WebEncodeExW(const Str : WideString; const EncChar: array of WideChar) : WideString;
function C_Decode(Text: PAnsiChar) : String; overload;
function C_Decode(Text: String) : String; overload;
[String] String Library
unit LibString; interface uses Windows, SysUtils; type TSetOfChar = set of Char; TFillTextAlign = (ftaLeft, ftaCenter, ftaRight); procedure Parsing(var Text, First : String; Deli : String); overload..
jazz16.tistory.com
[String] Wide String Library
unit LibWideString; interface uses Windows, SysUtils; function WideStrPCopy(Dest: PWideChar; const Source: WideString): PWideChar; function StringReplaceW(const S, OldPattern, NewPattern: WideString..
jazz16.tistory.com
function ToHex(const CH : char): String;
function _hex(const N : Integer) : Char;
begin
if N>=10 then RESULT := Chr( N + 55) // Chr( N + Ord('A') - 10)
else RESULT := Chr( N + 48) // Chr(N+Ord('0'));
end;
begin
RESULT := _hex(Ord(CH) div 16) + _hex(Ord(CH) mod 16);
end;
function FromHex(const CH,CL : Char): Char;
function _ToInt(N : Char) : Integer;
begin
case N of
'A'..'F' : RESULT := Ord(N) - 55; // Ord(N) - Ord('A') + 10;
'a'..'f' : RESULT := Ord(N) - 87; // Ord(N) - Ord('a') + 10;
'0'..'9' : RESULT := Ord(N) - 48; // Ord(N) - Ord('0');
else RESULT := 0;
end;
end;
begin
RESULT := Chr((_ToInt(CH) shl 4) or _ToInt(CL));
end;
function URLEncode(const Str : String) : String;
var
Len, I : Integer;
begin
Len := Length(Str);
RESULT:='';
if Len<1 then Exit;
For I:=1 to Len do begin
case Str[I] of
'A'..'Z', 'a'..'z', '0'..'9',
'/', '?', ':', '-', '_', '&',
'#', '@', '=', '.' : RESULT := RESULT + Str[I];
' ' : RESULT := RESULT + '+';
else RESULT := RESULT + '%' + ToHex(Str[I]);
end;
end;
end;
function URLDecode(const Str : String) : String;
var
Len, I : Integer;
begin
Len := Length(Str);
RESULT:='';
if Len<1 then Exit;
I:=1;
While True do begin
case Str[I] of
'+' : RESULT := RESULT + ' ';
'%' : begin
RESULT := RESULT + FromHex(Str[I+1], Str[I+2]);
I := I+2;
end;
else RESULT := RESULT + Str[I];
end;
Inc(I);
If (I>Len) then Exit;
end;
end;
procedure CommandParse_URL(URL : String; var CMD, Para : String);
var
Pick : Integer;
begin
Pick := Pos('?', URL);
if Pick > 0
then begin
Para := Copy(URL, Pick+1, Length(URL));
Delete(URL, Pick, Length(URL));
end
else Para := '';
Pick := BackPos('/', URL);
if Pick > 0 then CMD := Copy(URL, Pick+1, Length(URL))
else CMD := URL;
CMD := URLDecode(CMD);
Para := URLDecode(StringReplace(Para, '&', #13#10, [rfReplaceAll]));
end;
function WebEncode(const Str : String) : String;
begin
RESULT := StringReplace(
StringReplace(
StringReplace(
StringReplace(
StringReplace(Str, '&', '&', [rfReplaceAll] ),
'<', '<', [rfReplaceAll] ),
'>', '>', [rfReplaceAll] ),
'"', '"', [rfReplaceAll] ),
'''', ''', [rfReplaceAll] ); // IE에서는 ' 지원 안함
end;
function WebEncodeW(const Str : WideString) : WideString;
begin
RESULT := StringReplaceW(
StringReplaceW(
StringReplaceW(
StringReplaceW(
StringReplaceW(Str, '&', '&', [rfReplaceAll] ),
'<', '<', [rfReplaceAll] ),
'>', '>', [rfReplaceAll] ),
'"', '"', [rfReplaceAll] ),
'''', '$#39;', [rfReplaceAll] ); // IE에서는 ' 지원 안함
end;
function WebColor(const Color:TColor) : String;
var
RGB : DWORD;
begin
RGB := ColorToRGB(Color);
RESULT := '#' + ToHex(Chr(Byte(RGB))) + ToHex(Chr(Byte(RGB shr 8))) + ToHex(Chr(Byte(RGB shr 16)));
end;
function WebEncodeEx(const Str : String; const EncChar: array of Char) : String;
var
I : Integer;
E : String;
begin
RESULT := WebEncode(Str);
if Length(EncChar) > 0 then for I:=0 to Length(EncChar)-1 do begin
E := '&#' + IntToStr(Ord(EncChar[I])) + ';';
RESULT := StringReplace(RESULT, EncChar[I], E, [rfReplaceAll]);
end;
end;
function WebEncodeExW(const Str : WideString; const EncChar: array of WideChar) : WideString;
var
I : Integer;
E : WideString;
begin
RESULT := WebEncodeW(Str);
if Length(EncChar) > 0 then for I:=0 to Length(EncChar)-1 do begin
E := '&#' + IntToStr(Ord(EncChar[I])) + ';';
RESULT := StringReplaceW(RESULT, EncChar[I], E, [rfReplaceAll]);
end;
end;
function C_Decode(Text: String) : String;
begin
RESULT := C_Decode(PAnsiChar(AnsiString(Text)));
end;
function C_Decode(Text : PAnsiChar) : String;
const
BS_CNT = 10;
BS_I : array[0..BS_CNT-1] of Char = ('t', 'n', 'r', '"', '\', 'a', 'b', 'e', 'f', 'v' );
BS_V : array[0..BS_CNT-1] of Char = (#9, #10, #13, '"', '\', #7, #8, #27, #12, #11 );
var
I : Integer;
TMP : String;
function __Cut(var PT: PChar; Samples: TSetOfChar; Count: Integer): String;
begin
RESULT := '';
while Count > 0 do begin
Dec(Count);
if PT^ in Samples then begin
RESULT := RESULT + PT^;
Inc(PT);
end
else begin
Break;
end;
end;
end;
function __10to8(V10: DWORD): DWORD;
var
NX : DWORD;
begin
NX := 1;
RESULT := 0;
while V10 > 0 do begin
RESULT := RESULT + (V10 mod 10) * NX;
V10 := V10 div 10;
NX := NX * 8;
end;
end;
begin
RESULT := '';
while Text^ <> #0 do begin
if Text^ <> '\' then begin
RESULT := RESULT + Text^;
Inc(Text);
Continue;
end;
Inc(Text);
if Text^ = 'x' then begin
Inc(Text);
TMP := __Cut(Text, ['0'..'9', 'A'..'F', 'a'..'f'], 2);
if TMP <> '' then RESULT := RESULT + CHR(StrToInt('$' + TMP));
end
else if Text^ in ['0'..'7'] then begin
TMP := __Cut(Text, ['0'..'7'], 3);
if TMP <> '' then RESULT := RESULT + CHR(__10to8(StrToInt(TMP)));
end
else if Text^ = 'u' then begin
Inc(Text);
__Cut(Text, ['0'..'9', 'A'..'F', 'a'..'f'], 4);
// JUST CUT
end
else if Text^ = 'U' then begin
Inc(Text);
__Cut(Text, ['0'..'9', 'A'..'F', 'a'..'f'], 4);
// JUST CUT
end
else for I:=0 to BS_CNT-1 do begin
if Text^ = BS_I[I] then begin
RESULT := RESULT + BS_V[I];
Inc(Text);
end;
end;
end;
end;
end.
'Libraries > Delphi Library' 카테고리의 다른 글
[System] Resource Library (0) | 2022.06.24 |
---|---|
[System] Registry Library 2 (0) | 2022.06.24 |
[String] Wide String Library (0) | 2022.06.24 |
[String] String Library (0) | 2022.06.24 |
[System] System Power Control Library (0) | 2022.06.23 |