php中的escape函數

來源:互聯網
上載者:User

在json中不支援中文,用它傳送中文資料就會出現資料丟失或者亂碼,必須在傳送前對要發送的字串進行編碼,由於傳送過去需要用js進行資料解析,考慮到js中有unescape函數,故若在php中有個escape函數,對資料進行編碼,在用戶端用unescape進行 解碼,這樣就會方便很多。

先在網上搜尋一把,很多用php實現的escape函數,大同小異,比如下面一個:

function phpEscape($str) {
  preg_match_all("/[\x80-\xff].|[\x01-\x7f]+/",$str,$r);
  $ar = $r[0];
  foreach($ar as $k=>$v) {
    if(ord($v[0]) < 128)
      $ar[$k] = rawurlencode($v);
    else
      $ar[$k] = "%u".bin2hex(iconv("GB2312","UCS-2",$v));
  }
  return join("",$ar);
}

這個函數可以很好的工作,但是,也許有新手不理解這個函數的原理(比如我),用起來總是不放心,現在我就來解釋一下這個函數的原理。而且我認為,拿別人的代碼來複用,好比站在了巨人的肩膀上,但是若不理解別人的代碼,遲早要掉到地面上。

第一句:preg_match_all("/[\x80-\xff].|[\x01-\x7f]+/",$str,$r);這個是用Regex匹配字串中所有的字元,[\x80-\xff]. 匹配的是漢字,\x表示匹配字元的16進位編碼,[ ] 是類選擇符,“.” 表示任意一個字元,這樣[\x80-\xff].匹配的是兩個字元,其中第一個就是16進位從80到ff的字元,而這恰好就是漢字編碼的第一個字元。這樣就能完整的匹配一個漢字。關於unicode中漢字的編碼,大家可以到網上搜尋一下。同理,[\x01-\x7f]+英文字串,因為最早的英文是ASCII編碼,編碼值小於128,也就是16進位的從01到7f,"+"表示一個或者多個字元,這樣[\x01-\x7f]+就能匹配連續多個英文字串。

$ar = $r[0];             //$r[0]裡存放是匹配到的數組
  foreach($ar as $k=>$v) {
    if(ord($v[0]) < 128)                 //假如字元編碼值小於128,說明是個英文字元
      $ar[$k] = rawurlencode($v);    //直接用rawurlencode編碼
    else
      $ar[$k] = "%u".bin2hex(iconv("GB2312","UCS-2",$v));    //否則的話用iconv函數把漢字轉變成ucs-2編碼,也就是unicode編碼
  }

這個就是關於php中escape函數的一個實現,歡迎大家補充

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.