프로그래밍 초보 탈출

Libraries/Delphi Library

[String] String Library 2

째즈토끼 2022. 6. 24. 00:17
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,	'&', '&amp;',	[rfReplaceAll]	),
					'<', '&lt;',	[rfReplaceAll]	),
					'>', '&gt;',	[rfReplaceAll]	),
					'"', '&quot;',	[rfReplaceAll]	),
					'''', '&#39;',	[rfReplaceAll]	);	// IE에서는 &apos; 지원 안함
end;

function WebEncodeW(const Str : WideString) : WideString;
begin
  RESULT :=	StringReplaceW(
		StringReplaceW(
		StringReplaceW(
		StringReplaceW(
		StringReplaceW(Str,	'&', '&amp;',	[rfReplaceAll]	),
					'<', '&lt;',	[rfReplaceAll]	),
					'>', '&gt;',	[rfReplaceAll]	),
					'"', '&quot;',	[rfReplaceAll]	),
					'''', '$#39;',	[rfReplaceAll]	);	// IE에서는 &apos; 지원 안함
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