Restアプリケーションでの文字列のエンコードとデコードおよびhtmlの文字化けした問題のdelphi処理に関するRADStudio 10.4.1

目次

Restアプリケーションでの文字列のエンコードとデコードおよびhtmlの文字化けした問題のdelphi処理に関するRADStudio 10.4.1

1.wwwに関連するエンコードおよびデコード方法

1.1、System.NetEncoding.pas

1.1.1、TNetEncoding.Base64形式

1.1.2、TNetEncoding.HTML形式

1.1.3、TNetEncoding.URL形式

1.1.4.TNetEncodingの他の利用可能な変換機能について

1.2、Web.HTTPApp.pas

1.3、IdStrings.pas

 1.4。ウェブページのhtmlが文字化けしていることについて

2、基本変換

2.1.16進文字列を10進整数intに変換します

2.2.10進整数intを16進文字列に変換する

2.3、16進および2進変換


 

Restアプリケーションでの文字列のエンコードとデコードおよびhtmlの文字化けした問題のdelphi処理に関するRADStudio 10.4.1

 

1.wwwに関連するエンコードおよびデコード方法

1.1、System.NetEncoding.pas

1.1.1、TNetEncoding.Base64形式

        これは、画像のバイナリコード文字列(バイトストリーム)などのエンコードとデコードによく使用されます。

        アプリケーション1:画像をデータベースの一般フィールドタイプBlobに書き込み、画像の16進文字列を取得し、その前にXを追加すると、InsertまたはUpdateをBlobフィールドタイプにすることができます; TBlobField(ABlob:TField).SaveToStream(AMemoryStream) );  

        アプリケーション2:インターネットでのJson送信後の画像の残りの変換:

  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编码格式

// TStringStreamを使用する場合は、再度使用しないでください:
        Input:=
                TStringStream.LoadFromFile(FileName).DataString;
        Output1:=
                TNetEncoding.Base64.Decode(Input):string; // Base64エンコーディング
//読み取り専用属性も含まれるためTStringStream.Encoding:TEncodingの問題。多くの学生がこれを使用することがよくあります。そうでない場合は、文字列文字のTEncodingエンコーディング形式を判断する必要があります。

 

1.1.2、TNetEncoding.HTML形式

        これは、HTMLドキュメントコードをエンコードおよびデコードするためによく使用されます。

        TNetEncoding.HTML.Encode(const Input:string):string; // HTML编码

        TNetEncoding.HTML.Decode(const Input:string):string; // HTML解码

1.1.3、TNetEncoding.URL形式

        これは、URLコードなどをエンコードおよびデコードするためによく使用されます。

        TNetEncoding.URL.Encode(const Input:string):string; // URL编码:URL:TURLEncoding;

        TNetEncoding.URL.Decode(const Input:string):string; // 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编码的字符串

        安全でない文字は何ですか:

  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;

        安全でない文字の通常の数:

    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('#')];

URLエンコーディングの注意事項(以下は「GaoYongの3層レストサーバー製品」からコピーされたものです):
        URLエンコーディングルール:
        署名検証署名する場合、「-」、「_」、および「。」を除くすべての非英数字。すべての文字:
                パーセント記号(%)に置き換え、その後に2つの大文字の16進数を続けます:16進数の文字は大文字である必要があります。

        注:
        1。.NETシステムメソッドHttpUtility.UrlEncodeなどの一部のシステムメソッドは、「=」を%3D
                にエンコードするのではなく、「=」を「%3d」エンコードしますこれにより、暗号化された署名の検証に失敗します。開発者はチェックに注意を払います。

        2. Java 1.3以前のバージョンでは、URLエンコードのためにjava.net.URLEncoderでメソッドを呼び出すと、
                アスタリスク(*)などの一部の特殊文字はエンコードされません。
                URLエンコード規則では、アスタリスク(*)をエンコードする必要があると規定されているため、要求文字列にアスタリスク(*)が含まれている
                場合、上記の方法を使用すると、生成された署名は検証されません。
                したがって、パラメータ値に*が含まれている場合、クラスjava.net.URLEncoderのメソッドを使用してエンコードした後、
                開発者はアスタリスク文字「*」を「%2A」に手動で置き換える必要があります。そうしないと、暗号化された署名は常に渡されます。ただし、検証のために、開発者はチェックに注意を払う必要があります。

        3.一部の言語のurlencodeメソッドは、「スペース」を「+」としてエンコードしますが、実際には「%20」としてエンコードする必要があります。
                これにより、誤った署名も生成され、署名の検証に失敗します。
                開発者は注意深く確認し、手動で「+」を「%20」に置き換える必要があります。
                PHPでは、URLエンコーディングにはrawurlencodeメソッドをお勧めします。

1.1.4.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';

        Delphi 10.3以降で廃止:上記の1.1.3、TNetEncoding.URL形式および1.1.2、TNetEncoding.HTML形式をそれぞれ使用することをお勧めします。

1.3、IdStrings.pas

        ソースコードは$(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.Webページのhtml文字化けコードについて

//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;  

//この関数を使用してWebページのHtmlのコードを変換すると、文字化けしません
。functionHtmlDecode(AHtml:string):string;  
begin  
  {$ IFDEF UNICODE}  
     Result:= AHtml;  
  {$ ELSE}  
     Result:= UTF8ToString(AHtml);  
  {$ ENDIF}  
終了;  

2、基本変換

2.1.16進文字列を10進整数intに変換します

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

2.2.10進整数intを16進文字列に変換する

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

2.3、16進および2進変換

//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;

        使用機能:

//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;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

おすすめ

転載: blog.csdn.net/pulledup/article/details/109992895