RAD Studio 10.4.1 sobre la codificación y decodificación de cadenas en la aplicación Rest y delphi manejando problemas ilegibles de html

Tabla de contenido

RAD Studio 10.4.1 sobre la codificación y decodificación de cadenas en la aplicación Rest y delphi manejando problemas ilegibles de html

1. Métodos de codificación y decodificación relacionados con www.

1.1 、 System.NetEncoding.pas

1.1.1, formato TNetEncoding.Base64

1.1.2, formato TNetEncoding.HTML

1.1.3, formato TNetEncoding.URL

1.1.4. Acerca de otras funciones de conversión disponibles de TNetEncoding

1.2 、 Web.HTTPApp.pas

1.3 、 IdStrings.pas

 1.4. Acerca del código ilegible html de la página web

Dos, conversión base

2.1. Convertir una cadena hexadecimal en un entero decimal int

2.2. Convertir entero decimal int a cadena hexadecimal

2.3, conversión hexadecimal y binaria


 

RAD Studio 10.4.1 sobre la codificación y decodificación de cadenas en la aplicación Rest y delphi manejando problemas ilegibles de html

 

1. Métodos de codificación y decodificación relacionados con www.

1.1 、 System.NetEncoding.pas

1.1.1, formato TNetEncoding.Base64

        A menudo se utiliza para codificar y decodificar cadenas de códigos binarios de imágenes (flujos de bytes), etc.

        Aplicación 1: escriba la imagen en el tipo de campo general de la base de datos Blob, obtenga la cadena hexadecimal de la imagen y agregue X antes, luego Insertar o Actualizar puede ser el tipo de campo Blob; TBlobField (ABlob: TField) .SaveToStream (AMemoryStream) );  

        Aplicación 2: conversión de imágenes en reposo después de la transmisión Json en Internet:

  TBytes = TArray<Byte>;  //:可以强制转化一下:array of Byte
        Input :=
                TBytesStream.LoadFromFile(FileName).Bytes;
//或用TBytesStream的子类TStringStream,TBytesStream的父类为内存流TMemoryStream:
        Input :=
                TStringStream.LoadFromFile(FileName).Bytes;
        Output1 :=
                TNetEncoding.Base64.Encode(Input: array of Byte): string;  //Base64编码
        Output2 :=
                TNetEncoding.Base64.Decode(Output1 ): string;  //Base64解码
        Output_FileBytes :=
                TNetEncoding.Base64.DecodeStringToBytes(Output2 ): TBytes;  //Base64解码
        TStringStream.Create(Output_FileBytes);
        TStringStream.SaveToFile(Output_File: string);

//若使用TStringStream,不要再多此一举地:
        Input :=
                TStringStream.LoadFromFile(FileName).DataString;
        Output1  :=
                TNetEncoding.Base64.Decode(Input): string;  //Base64编码
//因为还涉及到只读属性TStringStream.Encoding: TEncoding问题;很多同学经常这样使用,否则你还得去判断字串符的TEncoding编码格式

// Si usa TStringStream, no lo vuelva a hacer:
        Input: =
                TStringStream.LoadFromFile (FileName) .DataString;
        Output1: =
                TNetEncoding.Base64.Decode (Input): string; // Codificación Base64
// Porque también involucra atributos de solo lectura TStringStream.Encoding: problema de TEncoding; muchos estudiantes a menudo usan esto, de lo contrario, debe juzgar el formato de codificación de TEncoding del carácter de cadena

 

1.1.2, formato TNetEncoding.HTML

        A menudo se utiliza para codificar y decodificar códigos de documentos HTML:

        TNetEncoding.HTML.Encode (entrada constante: cadena): cadena; // HTML 编码

        TNetEncoding.HTML.Decode (entrada constante: cadena): cadena; // HTML 解码

1.1.3, formato TNetEncoding.URL

        A menudo se utiliza para codificar y decodificar códigos URL, etc.

        TNetEncoding.URL.Encode (entrada constante: cadena): cadena; // URL 编码: URL: TURLEncoding;

        TNetEncoding.URL.Decode (entrada constante: cadena): cadena; // URL 解码: URL: TURLEncoding;

    function URLDecode(const AValue: string): string; inline;
        //:解码URL编码的字符串:内联
    function EncodeAuth(const Auth: string; const AExtraUnsafeChars: TUnsafeChars = []): string; inline;
        //:编码验证:内联
    function EncodeQuery(const AQuery: string; const AExtraUnsafeChars: TUnsafeChars = []): string; inline;
        //:编码Get查询参数:内联
    function EncodeForm(const AInput: string; const AExtraUnsafeChars: TUnsafeChars = []; AEncoding: TEncoding = nil): string; inline;
        //:编码表单:内联
    function FormDecode(const AValue: string; AEncoding: TEncoding = nil): string; inline;
        //:解码表单:内联

    function EncodePath(const APath: string; const AExtraUnsafeChars: TUnsafeChars = []): string;
        //:编码路径

    function Encode(const AInput: string; const ASet: TUnsafeChars; const AOptions: TEncodeOptions; AEncoding: TEncoding = nil): string; overload;
        //:URL编码
    function Decode(const AValue: string; const AOptions: TDecodeOptions; AEncoding: TEncoding = nil): string; overload;
        //:解码URL编码的字符串

        Cuáles son los personajes inseguros:

  TURLEncoding = class(TNetEncoding)
  public
  type
//:不安全的字符:
    //UnsafeChar = 32..127;
    UnsafeChar = Byte;
    TUnsafeChars = set of UnsafeChar;
    TEncodeOption = (SpacesAsPlus, EncodePercent);
    TEncodeOptions = set of TEncodeOption;
    TDecodeOption = (PlusAsSpaces);
    TDecodeOptions = set of TDecodeOption;

        Número ordinal de caracteres inseguros:

    const FormUnsafeChars: TUnsafeChars = [Ord('"'), Ord(''''), Ord(':'), Ord(';'), Ord('<'), Ord('='), Ord('>'),
      Ord('@'), Ord('['), Ord(']'), Ord('^'), Ord('`'), Ord('{'), Ord('}'), Ord('|'), Ord('/'), Ord('\'), Ord('?'), Ord('#'),
      Ord('&'), Ord('!'), Ord('$'), Ord('('), Ord(')'), Ord(','), Ord('~')];
    const AuthUnsafeChars: TUnsafeChars = [Ord('"'), Ord(''''), Ord(':'), Ord(';'), Ord('<'), Ord('='), Ord('>'),
      Ord('@'), Ord('['), Ord(']'), Ord('^'), Ord('`'), Ord('{'), Ord('}'), Ord('|'), Ord('/'), Ord('\'), Ord('?'), Ord('#')];
    const PathUnsafeChars: TUnsafeChars = [Ord('"'), Ord('<'), Ord('>'), Ord('^'), Ord('`'), Ord('{'), Ord('}'), Ord('|'),
      Ord('/'), Ord('\'), Ord('?'), Ord('#'), Ord('+')];
    const QueryUnsafeChars: TUnsafeChars = [Ord('"'), Ord(''''), Ord('<'), Ord('>'), Ord('#')];

Precauciones de codificación de URL (lo siguiente se copia del "producto de servidor Rest de tres niveles de Gao Yong"):
        Reglas de codificación de URL: al
        firmar la verificación de firma , todos los caracteres no alfanuméricos excepto "-", "_" y "." Todos los caracteres:
                reemplácelos con un signo de porcentaje (%) seguido de un número hexadecimal con dos letras mayúsculas : las letras del número hexadecimal deben estar en mayúsculas.

        Nota:
        1. Algunos métodos del sistema, como el método del sistema .NET HttpUtility.UrlEncode, codificarán '=' en '% 3d' en
                lugar de codificar : '=' en% 3D , lo que provocará que la firma cifrada falle la verificación. Los desarrolladores prestan atención a la comprobación.

        2. En Java 1.3 y versiones anteriores, cuando se llama al método en java.net.URLEncoder para la codificación de URL,
                algunos caracteres especiales, como asterisco (*), no se codificarán.
                Como las reglas de codificación de URL estipulan que el asterisco (*) debe estar codificado, si la cadena de solicitud contiene un asterisco (*),
                si se utiliza el método anterior, la firma generada no se verificará.
                Por lo tanto, si el valor del parámetro contiene *, después de usar el método bajo la clase java.net.URLEncoder para codificar, el
                desarrollador debe reemplazar manualmente el carácter de asterisco: "*" con "% 2A" , de lo contrario, la firma cifrada siempre pasará Sin embargo, para la verificación, los desarrolladores deben prestar atención a verificar.

        3. El método urlencode de algunos idiomas codificará "espacio" como "+", pero en realidad debería codificarse como "% 20".
                Esto también generará una firma incorrecta, lo que provocará que la firma falle en la verificación.
                Se solicita a los desarrolladores que lo comprueben cuidadosamente y reemplacen manualmente "+" con "% 20" .
                En PHP, se recomienda el método rawurlencode para la codificación de URL.

1.1.4. Acerca de otras funciones de conversión disponibles de TNetEncoding

//关于TNetEncoding其它可用的转化函数:
  TNetEncoding = class
  public
    function Decode(const Input, Output: TStream): Integer; overload;
    function Decode(const Input: array of Byte): TBytes; overload;
    function Decode(const Input: string): string; overload;
    function Encode(const Input, Output: TStream): Integer; overload;
    function Encode(const Input: array of Byte): TBytes; overload;
    function Encode(const Input: string): string; overload;
    function DecodeStringToBytes(const Input: string): TBytes;
    function EncodeBytesToString(const Input: array of Byte): string; overload;
    function EncodeBytesToString(const Input: Pointer; Size: Integer): string; overload;
    class property Base64: TNetEncoding read GetBase64Encoding;
    class property HTML: TNetEncoding read GetHTMLEncoding;
    class property URL: TURLEncoding read GetURLEncoding;
  end;

 

1.2 、 Web.HTTPApp.pas

function HTTPDecode(const AStr: string): string; inline; deprecated 'Use TNetEncoding.URL.Decode';
function HTTPEncode(const AStr: string): string; inline; deprecated 'Use TNetEncoding.URL.Encode';
function HTMLEncode(const AStr: string): string; inline; deprecated 'Use TNetEncoding.HTML.Encode';
function HTMLDecode(const AStr: string): string; inline; deprecated 'Use TNetEncoding.HTML.Decode';

        Obsoleto después de Delphi 10.3: se recomienda utilizar el formato anterior 1.1.3, TNetEncoding.URL y 1.1.2, TNetEncoding.HTML respectivamente.

1.3 、 IdStrings.pas

        El código fuente está debajo de $ (Delphi) \ source \ Indy10 \ Protocols

{对表示预定义字符的字符进行编码和解码
HTML4的实体。}

{处理&<>“字符}
function  StrHtmlEncode (const AStr: String): String;
function  StrHtmlDecode (const AStr: String): String;

{处理&<>"'字符}
function StrXHtmlEncode(const ASource: String): String;
function StrXHtmlDecode(const ASource: String): String;

 1.4. Acerca del código ilegible html de la página web

//uses System.pas;
{  //:关于字符串的定义:
  _RawByteStr = RawByteString;
  {$IFDEF NEXTGEN}
    UTF8String = type _AnsiString(65001);
    RawByteString = type _AnsiString($ffff);  //:$ffff=  65535
    {$NODEFINE UTF8String}
    {$NODEFINE RawByteString}
  {$ELSEIF Defined(LINUX64) or Defined(OSX64) or Defined(ANDROID)}
    UTF8String = type AnsiString(65001);
    RawByteString = type AnsiString($ffff);  //:$ffff=  65535
    {$NODEFINE UTF8String}
    {$NODEFINE RawByteString}
  {$ELSE}
    UTF8String = type AnsiString(65001);
    RawByteString = type AnsiString($ffff);  //:$ffff=  65535
  {$ENDIF}
    PUTF8String = ^UTF8String;
    PRawByteString = ^RawByteString;
  {$IF Defined(NEXTGEN) or Defined(LINUX64) or Defined(OSX64) or Defined(ANDROID)}
    {$NODEFINE PUTF8String}
    {$NODEFINE PRawByteString}
  {$ENDIF NEXTGEN or LINUX64 or OSX64 or ANDROID}

  function UTF8ToWideString(const S: _RawByteStr): _WideStr; inline;
  function UTF8ToString(const S: _RawByteStr): string; inline; overload;
}

//网页Html的代码用这个函数转化一下,就不乱码啦:
function HtmlDecode(AHtml: string):string;  
begin  
  {$IFDEF UNICODE}  
     Result:= AHtml;  
  {$ELSE}  
     Result:= UTF8ToString(AHtml);  
  {$ENDIF}  
end;  

// Utilice esta función para transformar el código del Html de la página web, y no se distorsionará:
function HtmlDecode (AHtml: string): string;  
begin  
  {$ IFDEF UNICODE}  
     Resultado: = AHtml;  
  {$ ELSE}  
     Resultado: = UTF8ToString (AHtml);  
  {$ ENDIF}  
fin;  

Dos, conversión base

2.1. Convertir una cadena hexadecimal en un entero decimal int

function HexStrToInt(AHexStr :string):Integer;
begin
  Result:= StrToInt('$'+UpperCase(LHexStr));
end;

2.2. Convertir entero decimal int a cadena hexadecimal

function IntToHexStr(AInt :Integer):string;
var
  LInt: Integer;
  LHexStr: string;
begin
  Result:= Format( '%.2x' ,[AInt] );
end;

2.3, conversión hexadecimal y binaria

//uses system.class.pas;

procedure BinToHex(const Buffer: TBytes; BufOffset: Integer;
  var Text: TBytes; TextOffset: Integer; Count: Integer); overload;

function HexToBin(const Text: PChar; TextOffset: Integer;
  var Buffer: TBytes; BufOffset: Integer; Count: Integer): Integer; overload;

        Función de uso:

//16进制字符串转2进制字符串
function HexStrToBinStr(AHexStr: string):string;
var
  LResult : WideString;
begin
  SetLength(LResult , Length(AHexStr) div 4);
  HexToBin(PWideChar(AHexStr), LResult [1], Length(AHexStr) div SizeOf(Char));
  Result:= LResult ;
end;


//2进制字符串转16进制字符串
function BinStrToHexStr(ABinStr: string):string;
var
  LResult : String;
begin
  SetLength(LResult , Length(ABinStr) * 4);
  BinToHex(ABinStr[1], PWideChar(LResult), Length(ABinStr) * SizeOf(Char));
  Result:= LResult ;
end;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Supongo que te gusta

Origin blog.csdn.net/pulledup/article/details/109992895
Recomendado
Clasificación