昨天試著要將字串折成陣列,不過在PHP雖然和Javascript都有split(),但是兩個運作的模式卻不一樣

在javascript:

var str = '我是中文字!';
var str_arr = str.split('');
//結果:str_arr = new Array('我','是','中','文','字','!');

在PHP:

$str = '我是中文字!';
$str_arr = split('',$str);
//結果:Warning: split() [function.split]: REG_EMPTY in split.php on line 2

所以在PHP只好自訂折字串為陣列函式,在網路上找到一個function

function stringtoarray($string){  
     $len = strlen($string);  
     for($cur=0; $cur<$len; $cur++){  
         $characterarray[] = $string{$cur};  
     }  
     return $characterarray;  
}
$str = 'abc123';
print_r(stringtoarray($str)); //輸出 array('a','b','c','1','2','3');

嗯…測試一下好像可能正常運作,可當我混加進去一些中文碼吧,他就呆掉了= =

$str = '中+e';
print_r(stringtoarray($str)); //輸出 array('�','�','�','+','e');

後來突然想到在UTF8中,中文字元長度是不一樣的,每3bytes為一組(=_=可是我記得不是2bytes個嗎?呃...不管啦) 但該死的UTF8對非中文字元的長度又定義為1bytes,所以在折陣列時,必需判斷他是不是中文,然後決定下一個索引 的序號。以下是我重新改良的寫法

function stringtoarray($string){
    $cur = 0;
    $len = strlen($string);
    while($cur < $len){
        $char = substr($string,$cur,1);
        if(utf8_encode(utf8_decode($char)) != $char){
            $char = substr($string,$cur,3);            
            $cur += 3;
        } else {
            $cur++;
       }
        $characterarray[] = $char;
    }
    return $characterarray;
} 
$str = '中+e';
print_r(stringtoarray($str)); //輸出 array('中','+','e');

但是注意一點的是,你的php文件必需使用utf8編碼喔,不然使用ANSI又會有問題了@_@。

身為一個專業的程式設計師,使用UTF8編碼是很合理的
後來發現字串處理的問題,還是交給mb_string系列的字串函式處理就好了

低溫烘培 發表在 痞客邦 PIXNET 留言(0) 人氣()