2007-09-22

PHP 中的 unescape 函式

由於 PHP 中並沒有支援 JavaScript 的 escape() 的反函式
所以除了尋找其他編碼方式,要不然就要自己寫一個解碼函數
但如果可以使用其他方式編碼會是比較好的

在 JavaScript 中還是有針對資料傳送用的編碼函數
例如:
decodeURL(str) 『解碼』
encodeURL(str) 『編碼』
decodeURLComponent(str) 『解碼』
encodeURLComponent(str) 『編碼』
以上的函數會將英文和數字以外的文字轉成 URL 的 16 進位編碼
decodeURL,encodeURL 不會轉換 [ ; / ? : @ & = + $ , ] 這些文字
decodeURLComponent,decodeURLComponent 則會
所以並非一定要用到 unescape 函式才可以處理編碼的問題

注意關於 PHP 中的 unescape 函式程式碼必須用到 iconv 函式庫
請確認 php.ini 中有載入此函式庫
<?php
function unescape($str){
    $str = rawurldecode($str);
    preg_match_all("/%u.{4}|&#x.{4};|&#\d+;|.+/U",$str,$r);
    $ar = $r[0];

    foreach($ar as $k=>$v){
        /* 下面的 UTF-8 可針對你的網頁編碼方式作變更 */
        if(substr($v,0,2)=="%u"){
            $ar[$k]=iconv("UCS-2","UTF-8",pack("H4",substr($v,-4)));}
        elseif(substr($v,0,3)=="&#x"){
            $ar[$k]=iconv("UCS-2","UTF-8",pack("H4",substr($v,3,-1)));}
        elseif(substr($v,0,2)=="&#"){
            $ar[$k]=iconv("UCS-2","UTF-8",pack("n",substr($v,2,-1)));}
    }
    return join("",$ar);
}
?>

參考網頁:
PHP实现Javascript的escape(),unescape()的方法
PHP5網管實驗室

2 回應:

SANKAI 提到...

板大中文好像寫相反了,decode是解碼,encode才是編碼 :)

胡忠晞 Jax 提到...

感謝糾正。
哈哈!我都忘記當時是怎麼寫的了,可能再暈吧!