目次
Restアプリケーションでの文字列のエンコードとデコードおよびhtmlの文字化けした問題のdelphi処理に関するRADStudio 10.4.1
1.1.4.TNetEncodingの他の利用可能な変換機能について
1.4。ウェブページのhtmlが文字化けしていることについて
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;