PHPでも出来ます。PHPでの符号化復号の詳細


前に書く
PHPもできる大事は私がまとめたPHP文法の特性と関連関数の種類ライブラリの経典的な使い方で、本当に四両千斤の効果を実現できるとは限らないです。しかしこれらの方法を把握して、あなたの仕事と勉強に助けがあります。転載は出典を明記してください(jb 51.net)
はじめに
PHPはよく見られるスクリプト言語で、主に簡単で勉強が速く、ほとんど50%以上のWebプログラムにPHPの影があるからです。PHPは開発のために豊富な関数とAPIインターフェースを提供しています。これは非常に便利にその強力な内蔵関数と拡張を使用することができます。本稿は「PHPでも仕事ができます。」シリーズの第一編であり、PHPの復号化、輸入転換に関する知識をまとめました。

三、PHPコード復号
1、ASCIIコード復号
ASCII(発音:英語発音:/ˈメッセージsk/ASS-kee、American Standard Code for Information Interchange、米国情報交換標準コード)はラテン文字に基づくコンピュータコードのセットです。主に現代英語を表示するために使用され、拡張バージョンEASCIIは他の西欧語を部分的にサポートし、国際標準ISO/IEC 646と同等である。万次元ネットワークのおかげでASCIIは広く通用し、2007年12月までUnicodeに取って代わられてきました。https://zh.wikipedia.org/zh/ASCII

PHP基本関数はASCIIの符号化復号関数を内蔵しています。これによりASCIIの符号化復号が容易に行えます。
int ord(string$string)/文字列stringの最初の文字のASCIIコード値を返します。
string chr(int$ascii)  ) //は、asciiで指定された単一の文字を返します。

<?php
$str = 'Welcome to China';
function getNum($string){
    $needle = 0;
    $num = '';
    while (isset($string[$needle])) {
        $num .= $num==0?'':' ';
        $num .= ord($string[$needle]);
        $needle++;
    }
    return $num;
}
function getChar($num){
    $num_arr = explode(' ', $num);
    $string = '';
    foreach ($num_arr as $value) {
        $string .= chr($value);
    }
    return $string;
}
echo " ASCII
";
echo getNum($str);
echo "
";
echo "ASCII
";
echo getChar(getNum($str));
/* @OUTPUT
ASCII
87 101 108 99 111 109 101 32 116 111 32 67 104 105 110 97
ASCII
Welcome to China
*/
 
?>
2、URLコーデック
URLコードは、フォーム入力をパッケージ化するブラウザの形式です。ブラウザはフォームからすべてのnameとその中の値を取得し、それらをURLの一部としてname/valueパラメータで符号化したり、サーバーに分離したりします。例えば、私達はホームページを訪問する時、%の文字列を持っています。これがURLコードです。
URL符号化はUTF-8符号化形式が一般的ですので、UTF-8形式でデータを転送することを推奨します。正常な意味のURLコードは、ASCIIコードの16進数の前に%を加算し、大文字と小文字の区別がないと理解できます。

string urlencode(string $str)  // URL , 。 + 。
string urldecode(string $str)  // %XX, ('+') 。
string rawurlencode (string $str)   // RFC 3986 , %20。
string rawurldecode (string $str)   // , (%) 。 + 。
二つの関数の使い方は同じです。+とスペースの変換処理に加えて、rawurlencodeはスペースを%20に変え、+をスペースに変えません。urlencodeは違います。

<?php
$str_arr = array(
    'www.jb51.net',
    'https://www.jb51.net/',
    'PHP ',
    '!@''''''''''''''''''''''''''''、'''、'''、'''''、'''''''、''''
    );
foreach ($str_arr as $key => $value) {
    echo $value,"\t->\t",urlencode($value),"
";
}
/* @OUTPUT
wwww.jb 51.net  ->    wwww.jb 51.net
https://www.jb51.net/  ->    http%3A%2F%2Fwww.jb51.net%2F
PHP   ->    PHP%E4%B9%9F%E8%83%BD%E5%B9%B2%E5%A4%A7%E4%BA%8B
!@(@@@@@@&*()_+=-~[]{}|\'、、//。?      ->    %21%40%23%24%25%5E%26%2A%28%29_%2B%3D-%7E%60%5B%5D%7B%7D%7C%5C%3B%3A%27%22%3C%3E%2C.%2F%3F
*/
?>
3、Base 64編復号
Base 64は、64個の印刷可能文字に基づいて、バイナリデータの表現方法である。2の6乗は64に等しいので、6桁ごとに1つのユニットで、ある印刷可能文字に対応しています。3バイトは24ビットで、4つのBase 64ユニットに対応しています。すなわち3バイトは4つの印刷可能な文字で表現されています。メールの送信コードとして使用できます。使用する文字は、大文字と小文字を各26文字ずつ加え、10個の数字とプラス記号「+」、スラッシュ「/」を合わせて64文字で、等号「=」はサフィックスとして使用されます。完全なbase 64は、可視RFC 1421およびRFC 2045を定義する。符号化後のデータは元のデータよりやや長く、元の4/3です。電子メールでは、RFC 822の規定により、76文字ごとに、1つのエコカーを加えて改行する必要があります。符号化後のデータ長は約135.1%と推定できます。https://zh.wikipedia.org/zh/Base64
string base 64_encode(string$data)  //base 64を使ってdataを符号化する。
string base 64_decode(string$data[,book$strict=false]  //base 64符号化のdataを復号する。
実例:HTMLページでは、Src属性でbase 64符号化方式で画像を出力することができ、HTTP要求回数を減らすことができる。

<?php
$string = file_get_content('3mc2.png');
echo '<img src="data:image/png;base64,',base64_encode($string),'">';
/* @OUTPUT
UEhQ5Lmf6IO95Yqe5aSn5LqL
*/
?>
4、HTMLエンティティ編復号
いくつかの文字はHTMLに予約されています。特別な意味を持っています。例えば、番号より小さい「<」はHTMLタグの開始を定義するために使われます。ブラウザがこれらの文字を正しく表示することを望むなら、私たちはHTMLソースに文字本体を挿入しなければなりません。文字本体には三つの部分があります。一つの和号「&」と一つの実体名(または一つの「驳」と一つの実体番号)と一つの分号「;」があります。http://www.ascii.cl/htmlcodes.htm
string htmlspecialchars(stringドルstring[,int$flags=ENT_]COMPAT 124 ENT_HTML 401[、string$encoding="UTF-8"[、book$double*]encode=true])  //下記のHTML特殊文字を含むHTMLエンティティコードを作成します。
1.'&'(ampersaid)becompes'&'
2.'''becompes''when ENT_NOQUOTES is not set.
3.'''''becompes'&刋039''((or&apps;)only when ENT_QUOTES is set.
4.'<'(less than)becompes'<'
5.''(greater than)becompes'>'
string htmllspecialchars_decode(string$string[、int$flags=ENT_]COMPAT 124 ENT_HTML 401)  //この関数の役割はhmlspecialchars()とは正反対です。これは特殊なHTMLエンティティを普通の文字に変換します。
同じ機能の関数httmlentitiesもあります。entity_decodeは、この関数は漢字さえもHTMLエンティティコードを使っています。また、文字化けが発生しますので、htmlspecialcharsを使ってデコードすることをお勧めします。
実例:XSSクロスステーションスクリプト攻撃を防止するために、ユーザから提出されたデータをHTMLエンティティに変換する必要があります。

<?php
$_POST['message'] = ' \'"><sCript src=https://www.jb51.net/hook.js>';
if (empty($_POST['message'])) {
    exit('Message is NULL');
}
$message = htmlspecialchars(trim($_POST['message']));
echo $message;
/* @OUTPUT
'&quot;&gt;&lt;sCript src=https://www.jb51.net/hook.js&gt;
*/
?>
5、2進数、8進数、10進数、16進数は互いに転換します。
進数間の転換はここでは何も言いません。とにかく大体同じです。どれぐらいの進数を覚えたら、どれぐらいの進数になりますか?例えば、10進数は9の次の方が10、2進数、8進数、16進数はこれに類推します。
string bin 2 hex/はASCII文字列に戻り、パラメータstrの16進数を表します。変換はバイト方式を使い、4ビットの高いバイトが優先されます。
string hex 2 bin/変換16進文字列はバイナリ文字列です。
number bindec(string$binary ustring)//戻るbinary_stringパラメータが表す2進数の10進数などの価値。
string decbin(int$number)//は、与えられたnumberパラメータのバイナリ表現を含む文字列を返します。変換できる最大値は10進数の4294967295で、その結果は32個の1の文字列です。
number octdec(string$octal u)string)//戻ります。stringパラメータが表す8進数の10進数等値です。
string decoct(int$number)//は、与えられたnumberパラメータを含む8進数表現を返します。変換できる最大値は10進数の4294967295で、その結果は37777777です。
string baseconvert(string$number,int$froombase、int$tobase)//任意の入力変換は、文字列を返し、numberがtobaseで入力した表示を含みます。number自体の進数はfroombaseで指定されています。froombaseとtobaseは2と36の間しかないです。10進数以上の数字は、a−zで表し、例えば、aは10、bは11及びzは35を表します。
6、GBK、UTF-8文字コード変換
コードを書く過程で、符号化問題による文字化けがよく発生します。実はエンコーディングの問題を解決するのはとても簡単です。一つのコードを使えばいいです。普通は10000ヤードを採用します。UTF-8は一番いい選択です。
ここでいう符号化は文字コードとファイル格納の符号化であり、もちろん、システムの符号化の差異に言及せざるを得ない。
システム             コーディング     文字の最後
Windows    GBK     \r
*nix             UTF-8  
特殊文字を扱う時は特に注意してください。
一般的なコードはGBK、UTF-8などがあり、関数の使用には主に2つが使われています。
string mbconvert_.encoding(string$str,string$to_encoding[,mixed$from_]encoding=mb_インターナールencoding())  //stringタイプのstrの文字を任意のfromからエンコードします。encodingをto_に変換する。encoding
string iconv(stringドルin u)charset、string$out_charset、stringドルstr)  //文字列のstrをin_からcharset変換コードはout_に符号化される。charset
実例:Windowsシステムは、WAMPサーバーを設置し、次のシナリオをUTF-8符号化のphpファイルとして保存します。ブラウザで文字化けのないphpディレクトリのファイルを確認できます。mbを使わないならconvert_.encodingトランスコードは、直接にトランスコード(Windowsをサーバとして)を出力します。

<?php
    function getDir($dir){
        static $string = '';
        if(is_file($dir)){
            $string.= $dir;
        }else{
            $oDir = @opendir($dir);
            while($fileName = readdir($oDir)){
                if($fileName!='.' && $fileName!='..'){
                    if(is_file($dir.'/'.$fileName)){
                        $string.=$fileName."
";
                    }elseif(is_dir($dir.'/'.$fileName)){
                        $string.= $dir.'/'.$fileName.'/'."
";
                        getDir($dir.'/'.$fileName);
                    }
                }
            }
        }
        return $string;
    }
    echo mb_convert_encoding( getDir('php'),'utf8', 'gbk' );
 
?>
四、まとめ
符号化はデータの処理の基礎ですので、PHPのプログラミング開発においてはかなり重要です。PHPの処理方法については、プログラムに適用するには数の把握が必要です。特に似たような関数はどうやって区別しますか?転載は出典を明記してください(jb 51.net)