欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP也能干大事之PHP中的編碼解碼詳解

 更新時(shí)間:2015年04月20日 10:22:34   投稿:junjie  
這篇文章主要介紹了PHP也能干大事之PHP中的編碼解碼詳解,本文講解了ASCII編解碼、URL編解碼、Base64編解碼、HTML實(shí)體編解碼、二進(jìn)制、八進(jìn)制、十進(jìn)制、十六進(jìn)制相互轉(zhuǎn)換等內(nèi)容,需要的朋友可以參考下

寫在前面

PHP也能干大事是我總結(jié)的PHP語法特性及相關(guān)函數(shù)類庫的經(jīng)典用法,并不一定是真正能實(shí)現(xiàn)四兩撥千斤的功效,但是掌握這些方法,可以在你的工作和學(xué)習(xí)上有一些幫助,希望大家能集思廣益,將《PHP也能干大事》豐富得更精彩!轉(zhuǎn)載請(qǐng)注明出處(jb51.net)

二、前言

PHP是常見的腳本語言,主要是因?yàn)槠浜唵我讓W(xué),上手快,幾乎50%以上的Web程序都有PHP的身影(不完全統(tǒng)計(jì))。PHP為開發(fā)這提供了豐富的函數(shù)和API接口,這使得我們能夠非常方便地使用其強(qiáng)大的內(nèi)置函數(shù)及擴(kuò)展,本文是《PHP也能干大事》系列的第一篇,主要總結(jié)PHP在編解碼、進(jìn)制轉(zhuǎn)換方面的知識(shí)。

三、PHP編解碼

1、ASCII編解碼

ASCII(發(fā)音:英語發(fā)音:/ˈæski/ ASS-kee,American Standard Code for Information Interchange,美國信息交換標(biāo)準(zhǔn)代碼)是基于拉丁字母的一套電腦編碼系統(tǒng)。它主要用于顯示現(xiàn)代英語,而其擴(kuò)展版本EASCII則可以部分支持其他西歐語言,并等同于國際標(biāo)準(zhǔn)ISO/IEC 646。由于萬維網(wǎng)使得ASCII廣為通用,直到2007年12月,逐漸被Unicode取代。 https://zh.wikipedia.org/zh/ASCII

PHP基本函數(shù)內(nèi)置了ASCII的編解碼函數(shù),這使得我們能輕松進(jìn)行ASCII編解碼。

int ord ( string $string ) //返回字符串 string 第一個(gè)字符的 ASCII 碼值。
string chr ( int $ascii  ) //返回相對(duì)應(yīng)于 ascii 所指定的單個(gè)字符。

復(fù)制代碼 代碼如下:

<?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 "字符轉(zhuǎn)ASCII碼\n";
echo getNum($str);
echo "\n";
echo "ASCII碼字符\n";
echo getChar(getNum($str));
/* @OUTPUT
字符轉(zhuǎn)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和其中的值,將它們以name/value參數(shù)編碼作為URL的一部分或者分離地發(fā)給服務(wù)器。比如我們?cè)谠L問網(wǎng)頁中,會(huì)出現(xiàn)很多帶有%的字符串,這就是URL編碼。

URL編碼一般采用UTF-8編碼格式,所以建議采用UTF-8格式傳遞數(shù)據(jù)。正常意義的URL編碼可以理解為ASCII碼的16進(jìn)制前加上%,無大小寫區(qū)分。

復(fù)制代碼 代碼如下:

string urlencode(string $str)  //此函數(shù)便于將字符串編碼并將其用于URL的請(qǐng)求部分,同時(shí)它還便于將變量傳遞給下一頁??崭窬幋a成 + 。
string urldecode(string $str)  //解碼給出的已編碼字符串中的任何 %XX,加號(hào)('+')被解碼成一個(gè)空格字符。
string rawurlencode (string $str)   //根據(jù) RFC 3986 編碼指定的字符,空格轉(zhuǎn)換成%20。
string rawurldecode (string $str)   //返回字符串,此字符串中百分號(hào)(%)后跟兩位十六進(jìn)制數(shù)的序列都將被替換成原義字符。 + 不被轉(zhuǎn)換成空格。

兩組函數(shù)用法一樣,除了對(duì)于+和空格的轉(zhuǎn)換處理上:rawurlencode將空格轉(zhuǎn)為%20,不將+轉(zhuǎn)為空格;urlencode則不一樣。

復(fù)制代碼 代碼如下:

<?php
$str_arr = array(
    'www.dbjr.com.cn',
    'http://www.dbjr.com.cn/',
    'PHP也能干大事',
    '!@#$%^&*()_+=-~`[]{}|\\;:\'"<>,./?'
    );
foreach ($str_arr as $key => $value) {
    echo $value,"\t->\t",urlencode($value),"\n";
}
/* @OUTPUT
www.dbjr.com.cn  ->    www.dbjr.com.cn
http://www.dbjr.com.cn/  ->    http%3A%2F%2Fwww.dbjr.com.cn%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、Base64編解碼

Base64是一種基于64個(gè)可打印字符來表示二進(jìn)制數(shù)據(jù)的表示方法。由于2的6次方等于64,所以每6個(gè)位元為一個(gè)單元,對(duì)應(yīng)某個(gè)可打印字符。三個(gè)字節(jié)有24個(gè)位元,對(duì)應(yīng)于4個(gè)Base64單元,即3個(gè)字節(jié)需要用4個(gè)可打印字符來表示。它可用來作為電子郵件的傳輸編碼。使用的字符包括大小寫字母各26個(gè),加上10個(gè)數(shù)字,和加號(hào)「+」,斜杠「/」,一共64個(gè)字符,等號(hào)「=」用來作為后綴用途。完整的base64定義可見RFC 1421和RFC 2045。編碼后的數(shù)據(jù)比原始數(shù)據(jù)略長,為原來的4/3。在電子郵件中,根據(jù)RFC 822規(guī)定,每76個(gè)字符,還需要加上一個(gè)回車換行。可以估算編碼后數(shù)據(jù)長度大約為原長的135.1%。 https://zh.wikipedia.org/zh/Base64

string base64_encode(string $data)  //使用 base64 對(duì) data 進(jìn)行編碼。
string base64_decode (string $data [, bool $strict = false ])  //對(duì) base64 編碼的 data 進(jìn)行解碼。

案例:HTML頁面中img標(biāo)簽可以在src屬性中采用base64編碼方式,來輸出圖片,這樣可以減少HTTP請(qǐng)求次數(shù)。

復(fù)制代碼 代碼如下:

<?php
$string = file_get_content('3mc2.png');
echo '<img src="data:image/png;base64,',base64_encode($string),'">';
/* @OUTPUT
UEhQ5Lmf6IO95Yqe5aSn5LqL
*/
?>

4、HTML實(shí)體編解碼

一些字符在HTML中是預(yù)留的,擁有特殊的含義,比如小于號(hào)「<」用于定義HTML標(biāo)簽的開始。如果我們希望瀏覽器正確地顯示這些字符,我們必須在 HTML 源碼中插入字符實(shí)體。字符實(shí)體有三部分:一個(gè)和號(hào)「&」 和一個(gè)實(shí)體名稱(或者一個(gè) 「#」 和一個(gè)實(shí)體編號(hào)),以及一個(gè)分號(hào)「;」。http://www.ascii.cl/htmlcodes.htm

string htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = “UTF-8″ [, bool $double_encode = true ]]] )  //對(duì)包含如下HTML特殊字符進(jìn)行HTML實(shí)體編碼
1.'&' (ampersand) becomes ‘&amp;'
2.'”‘ (double quote) becomes ‘&quot;' when ENT_NOQUOTES is not set.
3.”‘” (single quote) becomes ‘&#039;' (or &apos;) only when ENT_QUOTES is set.
4.'<‘ (less than) becomes ‘&lt;'
5.'>' (greater than) becomes ‘&gt;'

string htmlspecialchars_decode (string $string [, int $flags = ENT_COMPAT | ENT_HTML401 ])  //此函數(shù)的作用和 htmlspecialchars() 剛好相反。它將特殊的HTML實(shí)體轉(zhuǎn)換回普通字符。
還有功能相同的函數(shù)htmlentities/html_entity_decode,這對(duì)函數(shù)甚至對(duì)漢字都進(jìn)行了HTML實(shí)體編碼,而且會(huì)產(chǎn)生亂碼,所以建議使用htmlspecialchars進(jìn)行編解碼。

案例:防止XSS跨站腳本攻擊,需要對(duì)用戶提交的數(shù)據(jù)進(jìn)行HTML實(shí)體轉(zhuǎn)換:

復(fù)制代碼 代碼如下:

<?php
$_POST['message'] = '測試留言字符\'"><sCript src=http://www.dbjr.com.cn/hook.js>';
if (empty($_POST['message'])) {
    exit('Message is NULL');
}
$message = htmlspecialchars(trim($_POST['message']));
echo $message;
/* @OUTPUT
測試留言字符'&quot;&gt;&lt;sCript src=http://www.dbjr.com.cn/hook.js&gt;
*/
?>

5、二進(jìn)制、八進(jìn)制、十進(jìn)制、十六進(jìn)制相互轉(zhuǎn)換

進(jìn)制之間的轉(zhuǎn)換這里沒什么好說的,總之都差不多,只要記住多少進(jìn)制就是逢多少進(jìn)一位,比如10進(jìn)制就是9的下一位就是10,二進(jìn)制、八進(jìn)制、十六進(jìn)制以此類推。

string bin2hex (string $str) //返回 ASCII 字符串,為參數(shù) str 的十六進(jìn)制表示。轉(zhuǎn)換使用字節(jié)方式,高四位字節(jié)優(yōu)先。
string hex2bin (string $data) //轉(zhuǎn)換十六進(jìn)制字符串為二進(jìn)制字符串。
number bindec (string $binary_string) //返回 binary_string 參數(shù)所表示的二進(jìn)制數(shù)的十進(jìn)制等價(jià)值。
string decbin (int $number) //返回一字符串,包含有給定 number 參數(shù)的二進(jìn)制表示。所能轉(zhuǎn)換的最大數(shù)值為十進(jìn)制的 4294967295,其結(jié)果為 32 個(gè) 1 的字符串。
number octdec (string $octal_string) //返回 octal_string 參數(shù)所表示的八進(jìn)制數(shù)的十進(jìn)制等值。
string decoct (int $number) //返回一字符串,包含有給定 number 參數(shù)的八進(jìn)制表示。所能轉(zhuǎn)換的最大數(shù)值為十進(jìn)制的 4294967295,其結(jié)果為 “37777777777”。
string base_convert (string $number , int $frombase , int $tobase) //任意進(jìn)制轉(zhuǎn)換,返回一字符串,包含 number 以 tobase 進(jìn)制的表示。number 本身的進(jìn)制由 frombase 指定。frombase 和 tobase 都只能在 2 和 36 之間(包括 2 和 36)。高于十進(jìn)制的數(shù)字用字母 a-z 表示,例如 a 表示 10,b 表示 11 以及 z 表示 35。

6 、GBK、UTF-8字符編碼轉(zhuǎn)換

在寫代碼過程中,經(jīng)常遇到編碼問題而引發(fā)的亂碼。其實(shí)解決編碼問題非常簡單,只要使用一種編碼即可,一般來說,采用萬國碼——UTF-8是最好的選擇。

這里說的編碼是文字編碼和文件存儲(chǔ)的編碼,當(dāng)然,不得不提到系統(tǒng)的編碼的差異性:

系統(tǒng)             編碼     字符結(jié)尾
Windows    GBK     \r\n
*nix             UTF-8   \n

所以在處理特殊字符的時(shí)候要特別注意。

常見的編碼有GBK、UTF-8等等,函數(shù)使用上一般采用兩種:

string mb_convert_encoding (string $str , string $to_encoding [, mixed $from_encoding = mb_internal_encoding() ])  //將 string 類型 str 的字符編碼從可選的 from_encoding 轉(zhuǎn)換到 to_encoding。
string iconv (string $in_charset , string $out_charset , string $str)  //將字符串 str 從 in_charset 轉(zhuǎn)換編碼到 out_charset。

案例:Windows系統(tǒng),架設(shè)了一個(gè)WAMP服務(wù)器,將如下腳本另存為一個(gè)UTF-8編碼的php文件,即可通過瀏覽器查看無亂碼的php目錄里的文件;如果不是用mb_convert_encoding轉(zhuǎn)碼,將直接導(dǎo)致輸出亂碼(Windows作為服務(wù)器)。

復(fù)制代碼 代碼如下:

<?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."\n";
                    }elseif(is_dir($dir.'/'.$fileName)){
                        $string.= $dir.'/'.$fileName.'/'."\n";
                        getDir($dir.'/'.$fileName);
                    }
                }
            }
        }
        return $string;
    }
    echo mb_convert_encoding( getDir('php'),'utf8', 'gbk' );
 
?>

四、總結(jié)

編碼是數(shù)據(jù)的處理的基礎(chǔ),所以在PHP的編程開發(fā)過程中是相當(dāng)重要的。對(duì)于PHP的處理方法,應(yīng)用在編程中還需要數(shù)量掌握,特別有些相似函數(shù)要如何區(qū)分。轉(zhuǎn)載請(qǐng)注明出處(jb51.net)

相關(guān)文章

最新評(píng)論