Tabla de contenido
1. Métodos de codificación y decodificación relacionados con www.
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.4. Acerca del código ilegible html de la página web
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;