昨天試著要將字串折成陣列,不過在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系列的字串函式處理就好了
全站熱搜